gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r843 - GNUnet GNUnet/src/applications/fs/ecrs GNUnet/src/ap


From: grothoff
Subject: [GNUnet-SVN] r843 - GNUnet GNUnet/src/applications/fs/ecrs GNUnet/src/applications/fs/fsui GNUnet/src/include GNUnet/src/util GNUnet-docs/papers/ecrs gnunet-gtk gnunet-gtk/pixmaps gnunet-gtk/src
Date: Thu, 2 Jun 2005 08:06:09 -0700 (PDT)

Author: grothoff
Date: 2005-06-02 08:05:35 -0700 (Thu, 02 Jun 2005)
New Revision: 843

Added:
   gnunet-gtk/pixmaps/up.png
   gnunet-gtk/src/download.h
   gnunet-gtk/src/search.c
   gnunet-gtk/src/search.h
   gnunet-gtk/src/upload.c
   gnunet-gtk/src/upload.h
Modified:
   GNUnet-docs/papers/ecrs/main.aux
   GNUnet-docs/papers/ecrs/main.dvi
   GNUnet-docs/papers/ecrs/main.log
   GNUnet-docs/papers/ecrs/main.pdf
   GNUnet-docs/papers/ecrs/main.ps
   GNUnet-docs/papers/ecrs/main.tex
   GNUnet/configure.ac
   GNUnet/src/applications/fs/ecrs/download.c
   GNUnet/src/applications/fs/ecrs/meta.c
   GNUnet/src/applications/fs/ecrs/uri.c
   GNUnet/src/applications/fs/fsui/download.c
   GNUnet/src/applications/fs/fsui/fsui.c
   GNUnet/src/applications/fs/fsui/upload.c
   GNUnet/src/include/gnunet_ecrs_lib.h
   GNUnet/src/util/logging.c
   GNUnet/src/util/xmalloc.c
   gnunet-gtk/TODO
   gnunet-gtk/gnunet-gtk.glade
   gnunet-gtk/src/Makefile.am
   gnunet-gtk/src/download.c
   gnunet-gtk/src/fs.c
   gnunet-gtk/src/helper.c
   gnunet-gtk/src/main.c
Log:
hacking

Modified: GNUnet/configure.ac
===================================================================
--- GNUnet/configure.ac 2005-06-02 05:39:28 UTC (rev 842)
+++ GNUnet/configure.ac 2005-06-02 15:05:35 UTC (rev 843)
@@ -333,9 +333,9 @@
 AM_CONDITIONAL(HAVE_CURSES, test x$curses = x1)
 AM_CONDITIONAL(HAVE_PDCURSES, test x$pdcurses = x1)
 
-# check for gtk >= 2.4.0
+# check for gtk >= 2.6.0
 AC_MSG_CHECKING(for gtk)
-AM_PATH_GTK_2_0(2.4.0,without_gtk=false,without_gtk=true)
+AM_PATH_GTK_2_0(2.6.0,without_gtk=false,without_gtk=true)
 AM_CONDITIONAL(HAVE_GTK, test x$without_gtk != xtrue)
 if test $without_gtk != true
 then

Modified: GNUnet/src/applications/fs/ecrs/download.c
===================================================================
--- GNUnet/src/applications/fs/ecrs/download.c  2005-06-02 05:39:28 UTC (rev 
842)
+++ GNUnet/src/applications/fs/ecrs/download.c  2005-06-02 15:05:35 UTC (rev 
843)
@@ -140,6 +140,7 @@
   char * fn;
   struct stat st;
 
+  GNUNET_ASSERT(filename != NULL);
   this->treedepth = computeDepth(filesize);
   MUTEX_CREATE(&this->lock);
   this->handles = MALLOC(sizeof(int) * (this->treedepth+1));
@@ -1146,6 +1147,7 @@
   NodeClosure * top;
   FileIdentifier fid;
 
+  GNUNET_ASSERT(filename != NULL);
   fid = uri->data.chk;
   if (! ECRS_isFileUri(uri))
     return SYSERR;

Modified: GNUnet/src/applications/fs/ecrs/meta.c
===================================================================
--- GNUnet/src/applications/fs/ecrs/meta.c      2005-06-02 05:39:28 UTC (rev 
842)
+++ GNUnet/src/applications/fs/ecrs/meta.c      2005-06-02 15:05:35 UTC (rev 
843)
@@ -29,11 +29,6 @@
 #include "gnunet_ecrs_lib.h"
 #include <zlib.h>
 
-/* for pre LE 0.4.3 */
-#ifndef EXTRACTOR_PUBLICATION_DATE
-#define EXTRACTOR_PUBLICATION_DATE ((EXTRACTOR_KeywordType)71)
-#endif
-
 /**
  * Create a fresh MetaData token.
  */
@@ -746,13 +741,13 @@
          mime);
     mime = mimeMap[i][1];
   }
+  if (key == NULL)
+    key = filename;
   if (mime != NULL) {
     if (0 == strcmp(&key[strlen(key)-strlen(mime)],
                    mime))
       mime = NULL;
   }
-  if (key == NULL)
-    key = filename;
   if (mime == NULL) {
     renameTo = STRDUP(key);
   } else {

Modified: GNUnet/src/applications/fs/ecrs/uri.c
===================================================================
--- GNUnet/src/applications/fs/ecrs/uri.c       2005-06-02 05:39:28 UTC (rev 
842)
+++ GNUnet/src/applications/fs/ecrs/uri.c       2005-06-02 15:05:35 UTC (rev 
843)
@@ -458,6 +458,28 @@
 }
 
 /**
+ * Iterate over all keywords in this keyword URI?
+ * @return -1 if this is not a keyword URI, otherwise number of
+ *   keywords iterated over until iterator aborted
+ */
+int ECRS_getKeywordsFromUri(const struct ECRS_URI * uri,
+                           ECRS_KeywordIterator iterator,
+                           void * cls) {
+  int i;
+  if (uri->type != ksk) {
+    return -1;
+  } else {
+    for (i=0;i<uri->data.ksk.keywordCount;i++) 
+      if (iterator != NULL)
+       if (OK != iterator(uri->data.ksk.keywords[i],
+                          cls))
+         return i;
+    return i;
+  }
+}
+
+
+/**
  * Is this a file (or directory) URI?
  */
 int ECRS_isFileUri(const struct ECRS_URI * uri) {
@@ -554,6 +576,7 @@
 URI * ECRS_metaDataToUri(const MetaData * md) {
   URI * ret;
   int i;
+  int havePreview;
 
   if (md == NULL)
     return NULL;
@@ -561,11 +584,19 @@
   ret->type = ksk;
   ret->data.ksk.keywordCount = 0;
   ret->data.ksk.keywords = NULL;
+  havePreview = 0;
+  for (i=md->itemCount-1;i>=0;i--)
+    if (md->items[i].type == EXTRACTOR_THUMBNAIL_DATA)
+      havePreview++;
   GROW(ret->data.ksk.keywords,
        ret->data.ksk.keywordCount,
-       md->itemCount);
-  for (i=0;i<md->itemCount;i++)
-    ret->data.ksk.keywords[i] = STRDUP(md->items[i].data);
+       md->itemCount - havePreview);
+  for (i=md->itemCount-1;i>=0;i--) {
+    if (md->items[i].type == EXTRACTOR_THUMBNAIL_DATA) 
+      havePreview--;
+    else
+      ret->data.ksk.keywords[i-havePreview] = STRDUP(md->items[i].data);
+  }
   return ret;
 }
 
@@ -612,6 +643,12 @@
   GNUNET_ASSERT(uri2 != NULL);
   u1 = ECRS_uriToString(uri1);
   u2 = ECRS_uriToString(uri2);
+  if ( (u1 == NULL) || (u2 == NULL)) {
+    BREAK();
+    FREENONNULL(u1);
+    FREENONNULL(u2);
+    return NO;
+  }
   ret = strcmp(u1, u2);
   FREE(u1);
   FREE(u2);

Modified: GNUnet/src/applications/fs/fsui/download.c
===================================================================
--- GNUnet/src/applications/fs/fsui/download.c  2005-06-02 05:39:28 UTC (rev 
842)
+++ GNUnet/src/applications/fs/fsui/download.c  2005-06-02 15:05:35 UTC (rev 
843)
@@ -179,6 +179,7 @@
   while (root->parent != NULL)
     root = root->parent;
 
+  GNUNET_ASSERT(dl->filename != NULL);
   totalBytes = ECRS_fileSize(dl->uri);
   ret = ECRS_downloadFile(dl->uri,
                          dl->filename,
@@ -346,6 +347,7 @@
                       unsigned int anonymityLevel,                     
                       const struct ECRS_URI * uri,
                       const char * filename) {
+  GNUNET_ASSERT(filename != NULL);
   return startDownload(ctx,
                       anonymityLevel,
                       uri,
@@ -364,6 +366,9 @@
                      const char * filename) {
   FSUI_DownloadList * dl;
 
+  /* FIXME: check that filename matches
+     aborted download! */
+  GNUNET_ASSERT(filename != NULL);
   MUTEX_LOCK(&ctx->lock);
   dl = ctx->activeDownloads;
   while (dl != NULL) {
@@ -424,6 +429,7 @@
                          unsigned int anonymityLevel,                  
                          const struct ECRS_URI * uri,
                          const char * dirname) {
+  GNUNET_ASSERT(dirname != NULL);
   return startDownload(ctx,
                       anonymityLevel,
                       uri,
@@ -447,6 +453,7 @@
   FSUI_DownloadList * dl;
   int i;
 
+  GNUNET_ASSERT(dirname != NULL);
   dl = ctx->activeDownloads;
   while (dl != NULL) {
     if ( (0 == strcmp(dirname,
@@ -476,6 +483,7 @@
                         const char * dirname) {
   int ret;
 
+  GNUNET_ASSERT(dirname != NULL);
   MUTEX_LOCK(&ctx->lock);
   ret = stopDownloadAll(ctx, uri, dirname);
   MUTEX_UNLOCK(&ctx->lock);

Modified: GNUnet/src/applications/fs/fsui/fsui.c
===================================================================
--- GNUnet/src/applications/fs/fsui/fsui.c      2005-06-02 05:39:28 UTC (rev 
842)
+++ GNUnet/src/applications/fs/fsui/fsui.c      2005-06-02 15:05:35 UTC (rev 
843)
@@ -89,6 +89,11 @@
   READINT(ret->is_directory);
   READINT(ret->anonymityLevel);
   READINT(ret->completedDownloadsCount);
+  READINT(big);
+  ret->filename = MALLOC(big+1);
+  if (big != READ(fd, ret->filename, big))
+    goto ERROR;
+  ret->filename[big] = '\0';
   READLONG(ret->total);
   READLONG(ret->completed);
   READLONG(ret->startTime);
@@ -111,7 +116,8 @@
   
   ret->next = readDownloadList(fd,
                               ctx);
-  ret->next->parent = ret;
+  if (ret->next != NULL)
+    ret->next->parent = ret;
   ret->subDownloads = readDownloadList(fd,
                                       ctx);
   ret->subDownloadsNext = readDownloadList(fd,
@@ -176,6 +182,10 @@
   WRITEINT(fd, list->is_directory);
   WRITEINT(fd, list->anonymityLevel);
   WRITEINT(fd, list->completedDownloadsCount);
+  WRITEINT(fd, strlen(list->filename));
+  WRITE(fd, 
+       list->filename,
+       strlen(list->filename));
   WRITELONG(fd, list->total);
   WRITELONG(fd, list->completed);
   WRITELONG(fd, cronTime(NULL) - list->startTime);

Modified: GNUnet/src/applications/fs/fsui/upload.c
===================================================================
--- GNUnet/src/applications/fs/fsui/upload.c    2005-06-02 05:39:28 UTC (rev 
842)
+++ GNUnet/src/applications/fs/fsui/upload.c    2005-06-02 15:05:35 UTC (rev 
843)
@@ -427,7 +427,7 @@
   EXTRACTOR_removeAll(utc->extractors);
   utc->tl->isDone = YES;
   FREE(utc);
-  FREE(inboundFN);
+  FREENONNULL(inboundFN);
   return NULL;
 }
 

Modified: GNUnet/src/include/gnunet_ecrs_lib.h
===================================================================
--- GNUnet/src/include/gnunet_ecrs_lib.h        2005-06-02 05:39:28 UTC (rev 
842)
+++ GNUnet/src/include/gnunet_ecrs_lib.h        2005-06-02 15:05:35 UTC (rev 
843)
@@ -84,6 +84,13 @@
                                     void * closure);
 
 /**
+ * Iterator over keywords
+ * @return OK to continue to iterate, SYSERR to abort
+ */
+typedef int (*ECRS_KeywordIterator)(const char * data,
+                                   void * closure);
+
+/**
  * Create a fresh MetaData token.
  */
 struct ECRS_MetaData * ECRS_createMetaData(void);
@@ -255,6 +262,15 @@
 unsigned int ECRS_countKeywordsOfUri(const struct ECRS_URI * uri);
 
 /**
+ * Iterate over all keywords in this keyword URI?
+ * @return -1 if this is not a keyword URI, otherwise number of
+ *   keywords iterated over until iterator aborted
+ */
+int ECRS_getKeywordsFromUri(const struct ECRS_URI * uri,
+                           ECRS_KeywordIterator iterator,
+                           void * cls);
+
+/**
  * Duplicate URI.
  */
 struct ECRS_URI * ECRS_dupUri(const struct ECRS_URI * uri);

Modified: GNUnet/src/util/logging.c
===================================================================
--- GNUnet/src/util/logging.c   2005-06-02 05:39:28 UTC (rev 842)
+++ GNUnet/src/util/logging.c   2005-06-02 15:05:35 UTC (rev 843)
@@ -463,7 +463,6 @@
     VFPRINTF(stderr, format, args);
     va_end(args);
   }
-  BREAK();
   abort();
   exit(-1); /* just in case... */
 }

Modified: GNUnet/src/util/xmalloc.c
===================================================================
--- GNUnet/src/util/xmalloc.c   2005-06-02 05:39:28 UTC (rev 842)
+++ GNUnet/src/util/xmalloc.c   2005-06-02 15:05:35 UTC (rev 843)
@@ -151,7 +151,8 @@
 void xfree_(void * ptr,
            const char * filename,
            const int linenumber) {
-  GNUNET_ASSERT_FL(filename, linenumber, ptr != NULL);
+  GNUNET_ASSERT_FL(ptr != NULL,
+                  filename, linenumber);
 #if DEBUG_MALLOC
   MUTEX_LOCK(&lock);
   printf("%p free %s:%d\n",
@@ -177,7 +178,7 @@
                const int linenumber) {
   char * res;
 
-  GNUNET_ASSERT_FL(filename, linenumber, str != NULL);
+  GNUNET_ASSERT_FL(str != NULL, filename, linenumber);
   res = (char*)xmalloc_(strlen(str)+1,
                         filename,
                         linenumber);
@@ -201,7 +202,7 @@
   char * res;
   size_t min;
 
-  GNUNET_ASSERT_FL(filename, linenumber, str != NULL);
+  GNUNET_ASSERT_FL(str != NULL, filename, linenumber);
   min = 0;
   while ( (min < n) && (str[min] != '\0'))
     min++;
@@ -235,7 +236,8 @@
   void * tmp;
   size_t size;
 
-  GNUNET_ASSERT_FL(filename, linenumber, INT_MAX / elementSize > newCount);
+  GNUNET_ASSERT_FL(INT_MAX / elementSize > newCount,
+                  filename, linenumber);
   size = newCount * elementSize;
   if (size == 0) {
     tmp = NULL;

Modified: GNUnet-docs/papers/ecrs/main.aux
===================================================================
--- GNUnet-docs/papers/ecrs/main.aux    2005-06-02 05:39:28 UTC (rev 842)
+++ GNUnet-docs/papers/ecrs/main.aux    2005-06-02 15:05:35 UTC (rev 843)
@@ -20,7 +20,7 @@
 \citation{clark99distributed}
 \citation{esed}
 \citation{esed}
-\citation{anderson96eternity,clark99distributed,chen99prototype,freehaven-berk,feamster-infranet,herlihy87how,waldman2001tangler,pub00}
+\citation{anderson96eternity,chen99prototype,clark99distributed,freehaven-berk,feamster-infranet,herlihy87how,waldman2001tangler,pub00}
 \citation{cohen02replication}
 \citation{clark99distributed}
 address@hidden {section}{\numberline {2}Related Work}{3}{section.1.2}}
@@ -37,7 +37,7 @@
 address@hidden {subsection}{\numberline {2.4}Publius}{5}{subsection.1.2.4}}
 address@hidden {subsection}{\numberline {2.5}Tangler}{5}{subsection.1.2.5}}
 \citation{shamir}
-\citation{cfs:sosp01,mazieres02building,mazires00sfs,muthitacharoen02ivy,rowstron01storage}
+\citation{cfs:sosp01,mazires00sfs,mazieres02building,muthitacharoen02ivy,rowstron01storage}
 \citation{cfs:sosp01,rowstron01storage}
 \citation{maymounkov02kademlia,stoica01chord}
 \citation{mazires00sfs}

Modified: GNUnet-docs/papers/ecrs/main.dvi
===================================================================
(Binary files differ)

Modified: GNUnet-docs/papers/ecrs/main.log
===================================================================
--- GNUnet-docs/papers/ecrs/main.log    2005-06-02 05:39:28 UTC (rev 842)
+++ GNUnet-docs/papers/ecrs/main.log    2005-06-02 15:05:35 UTC (rev 843)
@@ -1,4 +1,4 @@
-This is pdfeTeX, Version 3.14159-1.10b-2.1 (Web2C 7.4.5) (format=pdflatex 
2005.5.20)  30 MAY 2005 09:20
+This is pdfeTeX, Version 3.14159-1.10b-2.1 (Web2C 7.4.5) (format=pdflatex 
2005.5.20)  1 JUN 2005 19:18
 entering extended mode
 **main.tex
 (./main.tex{/usr/share/texmf/pdftex/config/pdftex.cfg}
@@ -551,7 +551,7 @@
 Here is how much of TeX's memory you used:
  6614 strings out of 94960
  81038 string characters out of 1182470
- 208968 words of memory out of 1000001
+ 209976 words of memory out of 1000001
  9522 multiletter control sequences out of 10000+50000
  13677 words of font info for 55 fonts, out of 500000 for 1000
  198 hyphenation exceptions out of 1000
@@ -581,4 +581,4 @@
 pe1/bluesky/cm/cmr6.pfb></usr/share/texmf/fonts/type1/bluesky/cm/cmr7.pfb></usr
 /share/texmf/fonts/type1/bluesky/cm/cmr10.pfb></usr/share/texmf/fonts/type1/blu
 esky/cm/cmbx12.pfb>
-Output written on main.pdf (19 pages, 267330 bytes).
+Output written on main.pdf (19 pages, 267239 bytes).

Modified: GNUnet-docs/papers/ecrs/main.pdf
===================================================================
(Binary files differ)

Modified: GNUnet-docs/papers/ecrs/main.ps
===================================================================
--- GNUnet-docs/papers/ecrs/main.ps     2005-06-02 05:39:28 UTC (rev 842)
+++ GNUnet-docs/papers/ecrs/main.ps     2005-06-02 15:05:35 UTC (rev 843)
@@ -11,7 +11,7 @@
 %DVIPSWebPage: (www.radicaleye.com)
 %DVIPSCommandLine: dvips main.dvi -o main.ps
 %DVIPSParameters: dpi=600, compressed
-%DVIPSSource:  TeX output 2005.05.30:0920
+%DVIPSSource:  TeX output 2005.06.01:1918
 %%BeginProcSet: texc.pro
 %!
 /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
@@ -2504,152 +2504,157 @@
 4956D50291F0546E50FCAFA6DBD0099123F5ECD4AB338DB310DB4CAE11337A89
 8ED99B6F483940C97544F888EAF0CBEB11094A13C073D0061808662A04A82BA0
 AD35E8782F854AF66C20C0FEF18D0ECDD1646321B93D327E53D88CA0E825FA95
-05AA57BD70EE700EEE696546A4081CEDBF8A19E9CA90C426522BE55251BA7E19
-EB6A3E1B8359509B30CEF2A838FA84F66E3F18565062C3AB7A1C455481AD9729
-0C204A11D752E3AB1C18A9CDCE7530E09811EDFAA0BB49DE752C84FCE3819B61
-852995D09FBFDE41AA0E2BA2CA720C2D2B565FBFFEF16F6F9AA43D0AF1E466BA
-E31715E4D896A5D658DCB69CD7A412A382AFDD5F6D3996934D383C0F8DFAF866
-412815B3C155587D1F4E4928FA2627BD34495B845C1D033C5B003437B64C9854
-F807C6966D7AA32EC4FB094127DC046ABC489553BDD6CD9A63B840A589A4D6CC
-0FFEE6145F455D72ED43FB477C7104A10270FA0E42779F11190D5629F937F760
-E1A0D4154BF06E30DD1EB7EB81BB4DDCF3928A7AADA25C42B0283845825F1127
-05EBA90EE8A86000D11C003D716818ECEBDB94286FC65516A14D7B85A083E9B7
-6F9BBA613968181E66E4F6744062F0E4F58136CA6BCE0EB402E6FC0968698C89
-1591642D1FB6EA4D720D1C066693739AD4945337B49007ECAABB785188602AE6
-BDF4B77C8EB5093C4E0FE2760D19BB5E4E3BB3C8002485A405DBB1BF7DD15B6D
-28C2D44BBBCDFC4B4797E14362164FB9A30C41BD2C615382B8D8BF3CCF2713D1
-EA941EF9F0B52594D08225C6E72577E86CD417A66003564F3791AEEF2C22320D
-B955E5B5E2B07C9B7684CD5165765E8EE7C4EF8A41C4B453128897A7026387DB
-F167973005A51850BC7A7B6104658335BFCF1A2D9DB00FC7038965D11F8B62E1
-7FA88660E89FAEC5491D267476B076BAD7809E36C723191EFC466BA9BA286606
-996DEA17CEF38060FACF58FF1CE8C07AAB525EA9E3D755E69D7BBAC9D13B2AF2
-58E35CEE9B946269503BC5988A49E9E0390B5481587A6BC9111E9E5D3DCA89B6
-DC957867FE2B87C8A2E6F39BB33298650903A40F2DE818741155A395453E45BA
-72AF7515C914CF17D181C2434BAC4D1778F5CD1327073572F94B2CEB214C9C58
-5988696B4692818E3687C1E74FA096B9E8B996BB9AD7F94405053B46A034707B
-A631BD0EE78F644B26AFBD7595EFB2E4394BBE6ED22950998689351CE728F386
-38197FA6D8B7AE1B380E7ACE85646975A510E71203CE9536B83F6A7F514EA4E6
-6372AD300E086BE230DDE0E3333D1C1AAF2E47A4BECC525A05226BC172606107
-531E4CD319DB1C167B5D1DB3FE2C4ABF5A8AAFB1B72368C1E78471D6B3AAA308
-43EBE324B79E7A2F01B6F187E243478C762B7F1CC2F29ACB3269761EEDC32BA4
-C85303DE838E99042838297952C81A72D2407F7544B427ACD4CB236EC25A94AC
-0048E36473EF39BC6A73B6FBEE10A55A202F03C4AF418CF08972ADCA5A168D17
-F307031A6858852D16632771640B6E4FD311FAD12D9D5A7B45B218F3AF0E024E
-A34A9971F6B47FD7C80B0BD6460FC0076A4E5558AB077BE708B405DA187012F1
-774A649CB4A09B445B2A0E8BE89C8B3519E0BE1A14AD46FA62154F59AA80B501
-E9FB40B95899CF5A0C7C46B2C1D7BD0735DD9B05BAC00679D7AF13E4D1F1471C
-EE117781DA2DDCDB63C1833F3F1B054C171524D23C8E9761AF422B27B58ACEBA
-585B162AB5F639A1E995AF4DE91B16DE41B705B7F1FEB8F06E25D76BF8AC256A
-824F9F54E471514D29E9CFF397BF2B9F09DA25298BC90DA4B771BFC479FAC147
-15215241C9D0CB830983FD4816599A1AC94AD442B676BD7D467DFAED4B2322C0
-031A040AC98119ED7EFC875192E21D92C0A49A68D1162049AE61CFA17F26A9B0
-7E04425603AAD70E4FC35DC73EE82C903AC4800EA286114D3D59AC939D0BAD99
-A1F737642248CA3AACC9EE798948F1E951D5ACD16D8CEAC7169F4106414CC5F9
-4EFBDAE66B7272DCA55942026A97AF101DAD263FAEB71E4C1EDBB5DF2B0F8127
-AC83493D078EEC8C7F280C42675B60CD77820154DEEBE991B14956B750E94E1C
-B97123A153E3D7645175171CC0E8E802768A9386B9D48AEC3A36853D2A53555F
-23C68A89761EE8B3632A0F3AB312F50F569A00C420AED36D67CD2AEBE11EB985
-2C2D1DA5D205F7F58EF142CE728EFAC670C495D2BC13D1C5674CB69F3060B2F1
-4413092CBC73375EA96D84EF1E90B7883BE7E597DCC1B1F44BB371FD5FB40E00
-79CD2D432715DDD0F9CF2EB63EA86FD7078ACFC62110C237638BFEC8803B3CF4
-D4F39DDC1F0B077A190CFBBF1D3A31C7601136F32EFC3AEBCD0EF4F0212EB480
-113EDAB2C1A06B0EBD1F696BB6A1BF72CA794D27A6DBE193208A57BE983C619D
-17B93E78E6DBB9B7E74EC9F9055AE3AAA17299A69E0411D2E0A90189A98243D7
-56A45A8AE01ACF3BE326420474F62A73D0E044334CF4DD178B563B69A3617160
-CB6BCF3CF66401A559BD46D2B87BD87529CB9B3694F769F4E6B3F3B9FADD0C6A
-A9BCEA655F79DFED03A089F7B069DFC4166F8DE3A5A1A059E4CF17676D5037E2
-3CDCA3897653869B1DF95F92D0E9378D55BB3E90AE401A0CBCEFA636AFB7E213
-D6C6C6A696F29F8AA6C87FC0F4099376E14F64C016D1436DD2465F0A3F946672
-1819201908D00F833329F80F66F4BA7F28EEADC964D0437799BDEC57EA0514E6
-0F7E0CE856C4F59466453D820072359EE6F4083C148D57FF3880A5E0C76C611C
-DE41D7BF8B84C21A2C4360E9E4DDE4FA12599E8434891A343CF93B9BFEC83894
-5EFAD6D01D42DF559F0EE0A3C8BE54CD5EDF3786D4867B4D4864605F6B38FAD4
-359E1DAA080834CDABAF269DE8AE57C763CFB587F6138B8F33474E0E1CD76412
-E6A903820F61EF1B81CF91D2B8B326575E05018D610BC46CD319B5486805ECD6
-64545496B4B72C2F8FD1B8AD97C71BC4A1CC7A392298081C6F064724BB3CAB2F
-ECF620119E8A14CAD5EA0381B5555309562130957F1A56A785B1D707340E0ACC
-C570496B720CD2B83F3C9C5EF59C3D2D6941DF863B27E65D01F60078ED1FD591
-C77686708CA3E95979262F76E6F12E929AE30D55EA2939C6E1FC108B7847216D
-4A4BD29103682AACEBBEF3938A7DF8600D717C55FD16E1ABDD49A0DB0BBED8F0
-03C20AC3E397BB6EF5127D97018B7D8BFCA2C15B75602F364225929A553FADEB
-C687AE62DBC1A08F3F947BD431FF8E875B3F348907C09AABD9BFC6F55275B9C8
-FBDC05A74CD52DC62A7E160561FA286BCF4A9B13CC29006DA078C7F2BFD3B2EE
-4CF5F455AD5120F3155FCA642F7F9ECBCCFC2E8C942F5C27AEB2D0B426F0BA3E
-AD90C65ED70C995B046946F2AF2BD167D25C6892FDE586148B44818F3C6CBA5D
-71AF55A1CF141235CDC7E849FA36D4E49577DCCBA0B736B0C94FD36C13C75EA2
-00F22673C387532E5A11516D4BC67DC01ECFD9F34863EA116317DEF587466819
-71AD5FB3638854F4C87407796D7594EEB1560CF6BDCF0BDA81CF43DC22776941
-45E6E751B07B40754BFE3B83D675B0D5DCECC2278FDAC05F61EEEE274690B8A9
-454B0A676B1BB0B181697E005974EEC8E1F6CF1B8AF3D02FAAC7BF77680EA90D
-6BBC03BF22B64F2954E78B52FE386267721177DE2702177BCF28874D671FCCC6
-9D0FDF6C7B63E55626CAFEE75DEBE26F097F053C091956B8974DE74092F8D925
-34DA6BE1AFF622A18AE8078F0400802328B704D90D46655B3A9E1FF6065AEFDE
-B5F44DFCAABDDA034C1584DD20A559F02DBB0BDE03F04B56205713E31DFBA5F9
-118FAF6EE37EC3DB4A4F4D3EF2B065967DEB489BD20F70080B1A08DBB6762563
-7C7A51DA8C63BE22BE14C2E5AFA0F401541E374B7B6C2E61465281AD6B086E67
-28CB6B42C8CD24BE2FB35DAE461F18E15435D244A3892B0570161860ACB23231
-D325289D19BCA1AF5A968063356F047FB9DB5336DCC656CBC888C0ABC39821A9
-F87511C3DD2460AC195FC2DFA3A6CBF85B4AAA2839FE916A1B8ABE4550E65406
-DF101713B775FE2A4AE1D9F815540D6CB517FBE5BC1A6B20654584AC5E742E2F
-8D0D6EF28A15064601E13940460212A41C6B27822EFFE4BB41554F7F3C7002EE
-F51A1658B66E6798D5181A0116F96944FD5E65C7444630B58A3D776FC5AA5C0B
-807582D67DDF40674B8D45362042B9E118A607181520F1AA6105F831AC856EE3
-97CDF6E27E3BB8C3464F4072A7D2102BE4ED9875EBD4A71646C01579552E18A9
-7E9F886748675F29F38872E870866E39CE3486D6F42602507250F26801233FEE
-B948AE40111C5A72FEDF25BC602F1B482DCF5CDBB3312A0F00E52C7712E7652B
-4EA9F4B8B573D733441DE715B753DB6ACED90F2ED2B8C0DA27256435197B4089
-1953AE194398DC499D01281E7F374C9257FB51E6BB9E8182B9889ECBEE22B89A
-EBF75944445B1AFFFB3580CB78AF6EEE86D5A7C645DA0C55BD95DE9472BA437F
-9559977195109CB312EEFCFF77DC1D1DF2BF10157279BAA88A3A5169E6781D8D
-BD784C944F8CF906A569223900DCBD431A8746B7414CAC3FB4881E0A8090A1D1
-2BC51B9CC18EAB659AAAAC186120CF819F69ADF2C1F8D59918F3320B7B15EBE6
-6540B1EAF6717A46EE2ADFFB15F44296CA0F4673447AB6B02B60799B390B65BE
-8F4FCAB0AA67C192320F0761D39726F2892ED97E8AD70634407F8AEEBA00D78E
-D3B84ADAE3361842F04E3C6CA4F051FDE6E55A4C3BC018FC850563FC388DACF2
-DA62E2F975A5AFAC5AE345CA221CF82430BC85D811878258C66AB1F835DF4B4A
-E20B8B29EE06978CE3A7371737B34807327BDC0783D58AE365D3C5B599F96B2C
-B651F2D2386BA2F2449EA56689366002B9AB60FA5BBF437307195DA96C1319A6
-0507A0C50625576EB497A09A3758050C59457438563536406E93FB477510957A
-365046061A98BB1E8B82EE920133EACD03EBA6B006D96A659275CFAAE1637431
-38EA9FB9608D5EFB5A4BB3509AF0C3DE9E125CEB09D21A3235D1A31966CCE0AB
-E3479CBE6AE8E45AD31B3AA370E231AD7EEF2196943D4BD24FAE18856AADE9DF
-31CEE52DEC89FAECEB02D0C515E0D157229D395454875274BD9B2C0008B6D8F7
-7E548E189888CC3887981DC905F86622D6D34A7A45DCB6FD9BECB594B2337F58
-07157E57C8D231AC518AAF2011D6116BCF096DF8C7D190F93525265321AA5528
-822A883145DBFB49EE67DBE518A6DBBD5CE3C01DA7A30AD3FA7848870E0906CF
-152BBBE00DBBB1AFCEEEA720EAF0EE4BDF9940C132C7167317BF42BB5DB59A93
-69BA73F61E5CE56A732548C9B8C8C56D87AEA2F77249CB6DB3BD7B96508DB59B
-95BB5128038574DDBE4C7438FB8C3FDD47E3A26E2614DACB1634945DA09D936D
-CEB39CC83B6D2C26B00802D2F1F020F19C66480227109F8ACF0DF7162FD0A520
-0ACFDF227C2E3E4C86FD1D4E2EF24D4320F76F3ED9E69D0F0B05D4A7915C4565
-35EEAF20ECCBC217AB6E883C5C3C58DF8C7280C79D2B87FA0501304FEC36DE1B
-DF8903775978E566B9FBFA70B34C96AFF89503DEC47FDA64280F3C8E19AC3E4A
-90F515C842F9C849389504FE027D74465BCE8D852615E647F2B4659726C6EAA5
-46C336BD9E4B5E027BAF1F2C541B8248BDA3E350D345602C34FE9C7EB7C7A45E
-1328E747764FE46A28798B08882F02BA0F0F81B949587F3168CA107F229C1573
-993FA1A37A73880153D22E0AB255DD74F406D8F1EAC2A2ED63F7862ACD0F72B0
-19804A3AE595B248DB1DA8185D048CBD245BB75BD49CE921541F35FF9CEBC05F
-93219A25A68CACFCE26B887C9B0C14BCA523BDBC6315D832A7BA72008A9F99D3
-2EA2453F34BF07172FC433A9E92482E283059D4B4D8B22B67A7C86CA3F9E93BB
-D8FD6A4B061FC37427FE220E6CD4A5EE5D96F9FAC03935C8E7929A8D15E2C569
-EC2B747E5499FE7AF9AB8C522D534C7AAD465C38A274EB552B0F16CA9E5B227C
-0D40F3D58A2B1C03C98AD0F73FFD08B8B03C5F3AB42E64067BD5652AE9933327
-6DFE3D5F82D5FDD72BD58FDC71945CE4CC28E7D58D7361F5A44604FAB537E01E
-FD810F699D47AA6B04425C991A95931A594C153A6120B5C801220A474FC808D0
-502644EB4FD8D872A21FAB70F102EEA201F4E2C70A7C77D7A1E317051280B5C4
-21927E3415C67403F80C456C4C7055464D6712B0C1B359AFEB48EFD62C8A8F04
-011A22EC7FAED780E3A664EEEC4F1C387C95494ADE71184BEDA2A98D0D95A321
-A1ABB9BC7FD5693BF41FC8235064261C5A75070D4CB119C0CDB9DFB6DFF0FE20
-0B6E29790FA8AD37C34D626B5FFB6D4BD9D76607C21DB898E3FF80E25E30FDA7
-339EB349EDCEB418F52D908CDEC9A645D81EA36F86BD717707E0C6A97EB02CFD
-56EECC6A826EB88468BCA0884C0B9C25F9F8248FFD9CB766B348BB7238A6C3DD
-E2BC7AF30DE75BE3B3CED4F315FC39CF290F030627144DE6447944DBF879B5AB
-35C99773BAA7F62A285D9987F519130EBE38BF391B0F8B95354B15FC4E6F4B1E
-2DD80CA317F70AD81D472C21139FF1C3B4FD9012BFDA36A76F0CCC4FACCECED1
-4A81F86AA5A5B337C6B4DD738054F44CDBECB7D79F01F3B41126856861DB68D6
-E2A0CB5096E7D07A51E94E00D9B68AD833D28AC55F46A2EF665AC8EE7CA940B1
-65C87FF3012E84E8C95B0F308186474B267EAB6225F7742A5F9C377253AD863F
-E9347FD8B4
+05AA57BD70E9689794DAF57BA54E525BF63BD31400D90AF26EC53D081D446D10
+0E7045B944A57A015BE9FC546F55B3391F8571A383CEF1107214D124137D97DA
+E87C03666B899CBB25774890873C629B3E9B18980E24513A1ED18E94DC391193
+11B9EA8A7A21E3FE7A0A26D0C51CA0EECC569584ADFD804C0F2B598BECEAF010
+6C7B75EFFAD5644F49A5D0447D407354A4F3F3C1566275EE837957081180C8DB
+FDF283A180A0A7E847246AD677059DF3AA6507AE2870514FA588B71D1B96C3B4
+B19988C147D4896A185A017A3F3481D2E287027A2973F83A84D1210880FF340E
+6A8AB4A2BC39403C1E45E201F4B294B317AA152E5A0F5C52FCDF14C410783C23
+76B9603305C4AF7CB5E3400DDAEB81DCE3F1C7D2682E5339FE31103759EB84BB
+6E00E4D280C0925110E18D46CFB0691941A2C19530B90DC10358135A8F98F4F5
+A4E1C022A8A9898E567F9694D24992A7A40E5F70B99D36004D1B0A627A4E0765
+2426A35BDC9B3753EC2A568C7E0B012852295A85E8CE51D58E44AD32CB27045C
+36C4BD9D63FE460BAD6F9275F76799AE67498036DA3550EE04BA05B8177B910A
+D9D22D9789F66C82304B94B5AB71E2525B67B2AF5208C9163A9C65D966C14B12
+5E08101CB110688A1EBAC159ED073A6F50DB33156AEF9EFB19BC65D635C154FC
+83C2FAE76364C3FC28B040BAA32F4E4E87629151092D573AF3C52EF3C3237B49
+AAFE2C109981E6453CD22BF01A73B67F0211A543D6ED4A825C2D09EFA7F7B339
+10D833418372ED6FDFA701A5B2BD4E7BC6D8F12B6438A2EBC78FBF6A3FA7299B
+8FF15B855D06DE655351BD7FE685CED61C2F7837A8B7CD3383BB637303AF6346
+5C18F3ECB334CD92D63E1D41C494BC2B85BE61342D58200E94C58D751752F24D
+0D8A835A2173337B2B4F4AAA0F693496C0FFB2A09B15773C7C268625356D3313
+8536B6E0A666AF68E64BB178419264592085D8FFDF087A3E55CDCB810EE04C80
+056BF0ADF71695F1310F96D8F9246FC59093DE15377225A5B416245269D24897
+28104650FB1D1F588C5528190C6F0E4FE0B564BEB40CF3A5C10291F01A9617A7
+2A6CFAEBC6B21B7193E97275A22C141B498DC32B1E0772A3715144B71F25BAFD
+216456393957B4B3272B27E2EED59056AFAC19E59DB97630DA74C57F8F0790B6
+1890D65948CFE9D2B41CFE5C7EDCA2195C28F647B8E84DA319FD63B57686D358
+C27915174A2EB5755267E263FD50E0580FBDFA53DBED4C7F8402A279DA718151
+DE43F47683DC868AD32B05EB2090956E32A6CAD43BF149CF43C8CFB5BCD39CD4
+6950B3C3A4F49971678475DF2BF4A54CABF66DCAE5F51FE1FDD55B3255408F10
+36506FF7845903E71C203BAFD2E3D11DD640762F51C66E3B9ED8B723EBC88ED6
+54B21C7F2A1D8C79CDA599FBBF356EAC953DFAD13C84ECA89080B9D1C50BA36F
+9E6F60A11B85A9C744549B37B9D05927EB31D6A08064E63901211B532886BAAD
+5A29B5B95AE140DFADAE35894104BF9890EDB2908C489B7814FE781A2556AFD6
+0E4057FC07D96D7CA1A21C3A435749D804162F62957FEF616DE22A4E13EBDEE2
+9129DFC291813B12AD6919DB0BCE98AE03D183DD5BC05EA43CCCDFA084286089
+37A4055B370CC4819AB38BE25D9D3E06068CB3F2EF2C886A4721011AD1F74974
+448B79C2C52BAA063A6D57886C246953314AD80C64BCB335DEF0B299A3AF829E
+1C5FAD066C72EB0B425F55765CDD5845DE28FD4A9A1CBD507E150CB874688EB7
+48E5A210732497DE3ED9F9FA667C64A5D6BF36936DC66A6B6DCB4285D239D7A6
+52060E1B6F8CFFA42DD23FFE3616FC9E0B139EF5F6102CF5EAD5A697E27C9730
+D12B467AE68AEE2EDA987FD618B97E909223F0A3B82767416156A6CD2535FF08
+2403D449FFDBC1CBF9DA0393FE8C5B82679C7445936771CAB63FE00B765FC752
+822862399D9952471D9206E7A44F3019FE78FD737D2DA3D4BB554251DAB215B7
+06C83BAA01507CD363E585804509BED24C52DFA9B703FE5701AD07E03A792B5F
+F63A02EFC7EA15BA0011164AC7969A0354F8C46710F90A4FEFDC6B9A7C529A0C
+BF338754039B3344215DEC5C7A0CE770DCD3444952CB3973CE10F31F2517545E
+56854295B7BFB9623B1D1DF8532305A878B58F560B5FB53A04269E7935BA87BC
+BD24EB3872D43880DBFCF696ED449219EE7C24C7D8893C94F7C5BB953C28A709
+E99DAEC1E8D14EF3A4FCE36232A49D1918894BBA3EF62E648F722A510AF1FEAD
+F9B7362B1EFB4DEDC84A73A4B27586D47D736C3AC86043B94D75AF4D2229F315
+CC336CA38D13D770D14B0FD3A290CF70D273B65EA7A31CEDCD3DBB9BF243CB4A
+42730865D53047CCEC6A3483B9A6824D340C6939736818B254A4DA861FEAEEAF
+6BE79F6BCEF88FDB92959B40B6DEC099CA3B01B76770F7456D1401447676F652
+E6D2DA42FCF4B43CECBB3B31F6E4D23A683E0C5AC2C2A7A2388972CB810A27E5
+6E2A7AFD8592D5842541C596ACD14795F9D10AA08CCD7024795A583AB8D91DF6
+A1D6E938A68FF3ED6C8B7D5A8B252D0FCB061EE9D11EEF440E1252A793278910
+84F4A2AA3E9ED193827D8B8A11767F3FDF0C68853C372CBBD41C7245280D447B
+0CAE8B709ACD31EFE4D460ACD4C0704E3B4281408F20B2BC0B4AC210A639558C
+488E3CD2DC708BBBA73864F9125E346B67A76475EB3CDD93EA9F110087C2FCBC
+BDAA8A392873159F7C0B3B99D244F19BA44CEEC47291B28DFC914AF51268CAB3
+AC8DBC4011F4A48B06776015142B777F675238044C5D227893BDBE2F2F846292
+2E52A3BA4F89EC921EA0D9468C4382310A60B5CBBDBDED207D88531112E04ED1
+9CE98146DE30B76DD7D2FDDFF9A18322FBFF93F08ED6B5E399B65F7390CA3A63
+83793C41D7AB29204496DC59F43BC88842F7D3264CCD4582EEA53483A1B4DCF3
+937CA7D8A69B60B5844F7EA1BCE66939B5143CD30CAC6223FE3DF4C7F25D95D8
+1819DF89C473343A31D5DD76439E6DC7FB63115C11934A00ACE2A6997F3CD397
+88242CEED00AC11E613A5E2801E56536CEC71257D37264C3F82529C78F91F628
+606014162D76F1691A60CEE7929ECAE9AE74A886D6AA97262648518689BD97D6
+EEACAF61FC8A3ED8C88FD1DFDD20033F68E21C88BFBB49AFF82235C6413EBB50
+F57B9054DA277D477A3742F002599C264320BE80BA9DCC9FDF0F802A7DE1AA31
+0BE6269005DB38FAD8ED439E703873DCE49B4974BEF843DA04CCD6FB8942D087
+21BDFF1B8D19B1E2478D8F7556364A1F66EAA9692353EA4ADCB34D65CDCDC838
+9BBB71DBBC27C0E7DD64F44C81D9D27108F0D5BE9E6E4344CF2517B982D3CFA4
+76E6992F3B2BCF38EEDE7796EAC50D4D71AC90FBD642FA9D8FC8417D542DEC82
+09E52630ED1E66FF7153508F68846E5B5E4095AB38FC023EB2AE2CE549D36F79
+29BB22119D7894658F7F1CDCB577D324E06FE273136B94221F934091846E9DEE
+DB2DEDB7852A347D483B0B3E8F0F3C57F02B8D36B0598062050D07DE715AF982
+881C17336CAF06F3B5D5930FF343866500956BAB96D4E051EEB4EBCD75DB5E6E
+E69B65BCD96456726D7C7EAAA50E37CA83CDD200669F74CAD74C5E11F7D5227D
+6BD007507BBE7E08867A5BA1E90F8EA3B272EA8A8C69A6E42F3F1A0E556E89EB
+E8398DC84B192A8760DF0C8FCAE27CE862E21E485E150AE614DB4F9DB58E39B8
+C669A8E29E6CECA2D1907A4B51F8E80CAE216D45C83E0167C71DC2AA7687DC25
+79759CED3824A44A13CEBFF4AC41DC95503EF07998C7BCB82B93C25AF94B10CF
+45FCB92C5106C7CABD26BCE29AA08AFF47039D5853CB7B6E64AD54EFE8F33580
+8BE11E4E51423F6C3C081FDDD4E0CAE59F5432769E5B53455334960C019B444E
+1B55CB52C7CA1D537E63390F6D58C406962C08735BA50EF6881095F7A51051C3
+16CB872E33F04F81D94AA54942615E3221729F18B246A2E6FB1C10091EA65DED
+C2D03FA1C3339A4F307F42D2C01F7B77DA547E916F651EC88CDCC2067E047015
+F32034E0DF048F492B2AB94EB87E540FDB767C1F674800C9F5B58529B452EB95
+8C762DB0D27E14A4D9A35C725401D94ADDC98B383CC51594D3B769EEAF700341
+B30A9BB2D5313DF1C501DDE13C3130CAB88FB7016B0E586BF2D0BE42598FF228
+764F0F6ABA7615FF95F912DF2C999DDEB54939004F9EDCE9E7FE7CCF76C5E6D9
+24E9CBCDCE6BE79EDBCA9F697516D6CDBEC50EAA6A0E888BC3F37A78C8ED7658
+6F3926EA3AED2A9E455CDC95DF3AC95FBB37E9688EAF47676C4C5E7DEFF6297F
+67D8B3AB17A15C11E78BE5CB28189C7F310A50B5A9B4334A90774A2E8CB63F29
+5A6D8E2A8D175DE10057C033F70C4423BE8845900C495910A8445832DD597475
+BC2258DF20F2EC3AADEA47B8AEB60CB8CAB2DE94AD42340CA0B83A907881B28E
+69A6F05B98F599510B4DF483241D21FCDD57E09EAD4EC756472606152C4C08D2
+C75CF5111DB1AAC22528AB2B09E53585F416995FF04B9FF9EE671CA89FEDFD9D
+225BA87CE10C42572E344C43B4CB00C6558DBA8F5C5F1B2C09804E674BCA7404
+2C606CF3A252E5C743EFA9DC2AEA46CF964B347598CB5112BB694F2E9042CC02
+47596306510372D3DBA563026877B4BE333DB1F1357285382C3F6CE05B8B8CF2
+7562EABDD13A43ABB268416127438B84B6C07D56A396F5CDE346FD35F793D9F0
+45C6C894EE74E3B008E2A821615CB570C183EEA595259BE6F67B05BAA15DCC4B
+CF28FBCF9E8856A450F08F2A47E0D65503A281611C2299D2F22CBF3EB4CA4BAC
+F50E2AF10681E5D7A2516AF11AD21739CBB921F305665B628C4D4843E0BF4C47
+3C66FC21177ADA24BF13FE46373C506745562F7BDC3715667511D073E3ABBB09
+24B1D1664D2E9D4247CC97D20BBF42DAE5B2719041FC15968B76A2452FFEC5A8
+9E2F6EF4F03F10811D7967FFFDE50524CCCC491F36570539D983EB47FEE086C9
+1D42F6A086CB1DC60AE40B55CDCC4946F6CFA76865808285E4E77B8ED418DB69
+A91C1B51F261F40C6603012E7BF3BEFA26A051120D980E91C6B2BA12140A0649
+5D015E245E7B7D6C9058ACA339F35B39318D98708EF444EC19B76673BA1A6D34
+455714AE7868AE477C712BA644A651138F9F5DD3D00C362C130F7A7A95FF3932
+DBFD468BBDC1FBE2A841D0DCBB80F9A932F4D1CABD0C522CD9DB71681FEE8EEE
+71C2B80F933428703F9A91DA689234A3E69A5D23845B9077B1122FC973D08322
+A0891C2E0427ECE97F09C420C5A3ECD0A5FD955D74851C9FCDF89F44E494FCF3
+B1C816847E49BAE47A2B556A9B1E2A0359631434504BA2B4E6DEB5A15F10ADCB
+EA4B38E593751A9B87ACACE17BB172D2886DB511C3B092C2BC31CDA10AFDFA4C
+85EF1481412D093D68806CF3F349285B5135121DB6A81FDFF1F03885249295F9
+7E346CC8AFE512EE8CA4D2059B132D464DB750DDAA3CE0C9A725238A5FD6BEED
+8129B0D3923A05108098002D5019C51CEDDA482C6B4639E9F7AA257631EA61F3
+D161DF42E90BF697986392151934FC7BBC4D53A051B0333D166D87B1AD635526
+D0D085F55A20890B5739CCB14CDE2952945C759DB75BE21EC198F0899D9D2FF9
+6EBED9FB35563381CA788F51B46822D965B264EA9FE661A27219FBE51FF77DAA
+AAF4E9797EAD30DC034E8CF93A3D88E8D4F03A1DD2E294E42EAD5DC82ADD13E3
+AB798B86E1BDA67751461217821326EF6CAD757C97501D5715B33BCABE582BFA
+3296AA949879654E2FCC3C27AD33D3145172BA491B2FB2C927D00FD7B1638585
+D7F82AA8B62CF6682BA3151F0ABC5040C5F150BE3F954082A963AE4C81AB78F2
+2D21EB724ADB5D6B31F88681DE0796332F07FFA8F4D5A00C280DB9CEEDB8EDC8
+F5015D2651AF72045E021118809B6B807A1900D99D7A8D54E237363E23E31B91
+8AD8B84D1390B13D7C50CCB2D977F243FA51AF429862C8B87BA45387170936B4
+3DD7050AFE60EEAFEECB57D57B5B913ABE836867FCD057DF131CD26A2116F1CF
+0B7388ED74D128A48C018A42D435EF3403A021437727E0F70CEE3ED525376DA8
+3B7B0C2632C11AA993DBEDA6E441DB7BD2F6314A0CF22C7E1A71B0567F8F3127
+CC9A51DBD1243F1EDA1CD441076648599D4A2F2FA1925805680DEB622BED164D
+97EF69EEEC808A3271332A018198D050C58E200226EBDBFD5B8994C8FA421A47
+28F74A94EBF9F5ACF8FD8299CD6FEE8117DCCE70F3E144800CA222CA2F2B7D52
+31E73FE7F44A9265A193229292AAC90E1FF54AAAE483D56E627B046D99A76046
+92F0D5921F42057C020699001C663A9199ED521808870650A2096037F2E14EC6
+F81F95328626C5F347E26465CD970816FB124BD62FFA8890A4D0AA9FF93FCC76
+7A7D8E4C5E46905B8DE7FDFF155E61EE2AE28D0E16D2A1C8E97B7C76E47FDEEB
+DDFAC692186482250B63460AC8425D9593591AA5EC1F3F604CAEE64CD4436A42
+90870BB3F761FAA947A8FD9B5FF3DF8DF0E6343B12A6CBB87416FE56552B1C17
+F58639DB536EF48B3C36B1DED094A8A846B105F9BAABC6539FECCDA09B861FD4
+8E92A4C9F220A16BEFA2BCA31BCD13D445C8ABC5449C553932CF50B3600A1602
+9436A69DA6C5BDC0E744820F09BE98458BD395A8F7B2254EE80F3D3BA3CC5D08
+F6D319B815C9EF30793249C2B7AD83CAF49B5C4C5D47306307B305D5FB1D37E9
+D7F1FA03E36991924A356ED08501039D3E5140E00730DE7C614B01DF725D5748
+9F6B229836A1CBF577A6EF8E801A8CB5DEC12D8747EB7ABFF3BC324160C14AD6
+481D498A0561A9B7EE565607122E35402E26
 0000000000000000000000000000000000000000000000000000000000000000
 0000000000000000000000000000000000000000000000000000000000000000
 0000000000000000000000000000000000000000000000000000000000000000
@@ -5180,8 +5185,8 @@
 54 57 6[24 39 39 1[39 39 2[39 39 39 1[24 27 24 2[31 31
 24 26[43 12[{ TeX74afc74cEncoding ReEncodeFont }63 74.7198
 /CMTI9 rf /Fq 133[39 6[39 3[40 50 1[25 43 1[29 3[39 1[36
-10[69 5[63 66 53 63 3[71 1[36 69 2[61 69 1[63 6[23 23
-58[{ TeXaae443f0Encoding ReEncodeFont }22 83.022 /CMMI10
+10[69 5[63 66 53 63 3[71 1[36 69 2[61 69 59 63 6[23 23
+58[{ TeXaae443f0Encoding ReEncodeFont }23 83.022 /CMMI10
 rf /Fr 134[50 1[69 50 53 37 38 39 1[53 48 53 80 27 50
 29 27 53 48 29 44 53 42 53 46 12[66 53 2[65 72 75 91
 1[75 2[75 75 60 63 73 2[72 9[48 48 48 48 48 48 48 2[27
@@ -5287,7 +5292,7 @@
 (UCLA,)g(USA)1532 1002 y Fw(address@hidden)606
 1062 y Fy(2)679 1094 y Fx(CERIAS)f(/)h(In)n(terdepartmen)n(tal)f
 (Program)i(in)f(Linguistics,)h(Purdue)e(Univ)n(ersit)n(y)-6
-b(,)25 b(USA)1532 1185 y Fw(address@hidden)1580
+b(,)25 b(USA)1591 1185 y Fw(address@hidden)1580
 1244 y Fy(3)1653 1276 y Fx(Motorola)j(Labs,)e(USA)1572
 1368 y Fw(address@hidden)827 1427 y Fy(4)900 1459
 y Fx(Departmen)n(t)f(of)h(Computer)g(Science,)g(Univ)n(ersit)n(y)f(of)i
@@ -5345,10 +5350,10 @@
 FA(p)r(eers)h(w)n(an)n(t)g(to)g(share)f(data.)h(The)g(prop)r(osed)f
 (enco)r(ding)523 4725 y(sc)n(heme,)36 b(called)g(ECRS,)g(allo)n(ws)f(b)
 r(oth)i(con)n(ten)n(t)f(and)g(queries)g(to)g(b)r(e)h(encrypted)f(while)
-523 4825 y(b)r(eing)e(transmitted)h(or)e(stored)g(on)h(the)h(net)n(w)n
-(ork.)e(This)h(ensures)f(that)i(serv)n(ers)d(as)h(w)n(ell)523
-4924 y(as)g(all)h(in)n(termediate)f(p)r(eers)h(are)f(oblivious)g(of)g
-(the)i(data)e(they)h(are)f(actually)g(handling,)p Black
+523 4825 y(b)r(eing)g(transmitted)g(or)g(stored)f(on)h(the)g(net)n(w)n
+(ork.)f(This)h(ensures)f(that)h(in)n(termediaries)523
+4924 y(are)30 b(oblivious)f(of)h(the)h(data)f(they)h(are)e(handling,)i
+(reducing)e(the)i(c)n(hance)f(that)h(they)f(can)p Black
 Black eop end
 %%Page: 2 2
 TeXDict begin 2 1 bop 0 0 a
@@ -5367,19 +5372,18 @@
 end
  523 232 a Black Fx(2)237 b(C.)27
 b(Grotho\013,)f(K.)g(Grotho\013,)g(T.)h(Horozo)n(v,)f(J.T.)h(Lindgren)p
-Black 523 448 a FA(reducing)f(the)i(c)n(hance)e(that)h(they)g(can)g(b)r
-(e)h(singled)e(out)h(for)g(an)f(attac)n(k)g(or)h(held)g(liable.)g(It)
-523 548 y(is)22 b(imp)r(ortan)n(t)g(to)g(note)g(that)h(the)f(primary)f
-(goal)g(is)h Ft(deniability)j FA(for)d(the)g(p)r(eers)g(storing)f(and)
-523 648 y(transmitting)i(the)g(information.)f(These)h(p)r(eers)f(m)n
-(ust)h(b)r(e)g(able)g(to)g(claim)f(that)i(decrypting)523
-747 y(the)k(information)f(is)g(infeasible)h Ft(for)j(them)p
-FA(.)648 865 y(W)-7 b(e)23 b(\014nd)g(it)f(acceptable)g(if)h(a)g
-(censor)e(who)h(precisely)g(kno)n(ws)f(whic)n(h)i(con)n(ten)n(t)f(to)g
-(censor)523 965 y(is)28 b(able)f(to)g(matc)n(h)h(a)f(request)g(or)f
-(resp)r(onse)h(against)f(that)i(particular)f(con)n(ten)n(t.)g(ECRS)g
-(is)523 1065 y(supp)r(osed)33 b(to)f(protect)h(in)n(termediaries)e
-(that)i(merely)f(transmit)h(information)f(and)h(that)523
+Black 523 448 a FA(b)r(e)19 b(singled)g(out)f(for)h(an)f(attac)n(k)g
+(or)g(held)h(liable.)f(It)i(is)e(imp)r(ortan)n(t)h(to)f(note)h(that)g
+(the)g(primary)523 548 y(goal)25 b(is)i Ft(deniability)i
+FA(for)d(the)h(p)r(eers)f(storing)g(and)g(transmitting)g(the)h
+(information.)f(These)523 648 y(p)r(eers)37 b(m)n(ust)g(b)r(e)h(able)f
+(to)g(claim)g(that)g(decrypting)g(the)g(information)g(is)g(infeasible)g
+Ft(for)523 747 y(them)p FA(.)648 865 y(W)-7 b(e)23 b(\014nd)g(it)f
+(acceptable)g(if)h(a)g(censor)e(who)h(precisely)g(kno)n(ws)f(whic)n(h)i
+(con)n(ten)n(t)f(to)g(censor)523 965 y(is)28 b(able)f(to)g(matc)n(h)h
+(a)f(request)g(or)f(resp)r(onse)h(against)f(that)i(particular)f(con)n
+(ten)n(t.)g(ECRS)g(is)523 1065 y(supp)r(osed)33 b(to)f(protect)h(in)n
+(termediaries)e(that)i(merely)f(transmit)h(information)f(and)h(that)523
 1164 y(need)i(to)g(b)r(e)h(able)e(to)h(sho)n(w)g(that)g(they)g(w)n(ere)
 f(unable)h(to)g(recognize)f(ob)5 b(jectionable)34 b(in-)523
 1264 y(formation)g(for)g(their)h(o)n(wn)f(protection.)g(The)h(ultimate)
@@ -5442,9 +5446,9 @@
 (in)h(the)g(presence)e(of)i(malicious)f(participan)n(ts.)648
 3411 y(The)k(enco)r(ding)g(mec)n(hanism)f(m)n(ust)i(ensure)e(that)i(in)
 n(v)-5 b(alid)31 b(replies)f(are)g(detected)i(and)523
-3511 y(that)38 b(p)r(eers)f(can)h Ft(distinguish)g FA(v)-5
-b(aluable)38 b(con)n(ten)n(t)f(from)g(maliciously)g(generated)g(noise.)
-523 3611 y(This)32 b(is)g(particularly)e(imp)r(ortan)n(t)i(in)g(three)g
+3511 y(that)37 b(p)r(eers)g(can)f(distinguish)h(v)-5
+b(aluable)37 b(con)n(ten)n(t)f(from)h(maliciously)f(generated)g(noise.)
+523 3611 y(This)c(is)g(particularly)e(imp)r(ortan)n(t)i(in)g(three)g
 (cases.)f(First,)h(if)g(large)f(\014les)h(are)f(assem)n(bled)523
 3710 y(using)c(blo)r(c)n(ks)f(from)h(m)n(ultiple)h(p)r(eers,)f(some)f
 (of)i(these)f(p)r(eers)g(ma)n(y)f(b)r(e)i(malicious)e(and)h(try)523
@@ -5458,39 +5462,39 @@
 b(in)n(termediaries)g(and)g(that)h(are)f(merely)g(routing)g(the)523
 4208 y(con)n(ten)n(t)k(should)g(b)r(e)g(able)g(to)g(detect)g(in)n(v)-5
 b(alid)36 b(replies.)g(This)g(enables)g(lo)r(cal)f(economies)523
-4308 y(\(lik)n(e)28 b([)p 0 1 0 TeXcolorrgb 731 4308
-a
+4308 y(\(lik)n(e)29 b(in)h([)p 0 1 0 TeXcolorrgb 831
+4308 a
 SDict begin H.S end
- 731 4308 a 0 1 0 TeXcolorrgb FA(11)p 0 1 0 TeXcolorrgb
-814 4255 a
+ 831 4308 a 0 1 0 TeXcolorrgb FA(11)p 0 1 0 TeXcolorrgb
+914 4255 a
 SDict begin H.R end
- 814 4255 a 814 4308 a
+ 914 4255 a 914 4308 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.ebe2003) cvn H.B /ANN pdfmark end
- 814 4308 a Black FA(]\))g(and)f(prev)n
-(en)n(ts)g(the)h(retransmission)e(and)h(replication)g(of)g(corrupted)g
-(data)g(b)n(y)523 4408 y(non-malicious)f(p)r(eers.)648
-4526 y(ECRS)h(uses)g(t)n(w)n(o)g(fundamen)n(tal)h(primitiv)n(es)g(in)g
+ 914 4308 a Black FA(]\))g(and)f(prev)n
+(en)n(ts)f(the)i(retransmission)d(and)i(replication)g(of)g(corrupted)f
+(data)523 4408 y(b)n(y)f(non-malicious)g(p)r(eers.)648
+4526 y(ECRS)g(uses)g(t)n(w)n(o)g(fundamen)n(tal)h(primitiv)n(es)g(in)g
 (the)g(o)n(v)n(erall)d(enco)r(ding)j(sc)n(heme.)f(The)523
-4625 y(ma)5 b(jorit)n(y)38 b(of)i(the)g(con)n(ten)n(t)f(in)g(the)h(net)
-n(w)n(ork)e(uses)i(a)f(v)-5 b(arian)n(t)38 b(of)i(F)-7
-b(reenet's)39 b(CHK)g(en-)523 4725 y(co)r(ding)34 b([)p
-0 1 0 TeXcolorrgb 818 4725 a
+4625 y(ma)5 b(jorit)n(y)25 b(of)i(the)g(data)f(is)g(encrypted)h(with)g
+(a)f(v)-5 b(arian)n(t)26 b(of)g(F)-7 b(reenet's)27 b(CHK)f(enco)r(ding)
+g([)p 0 1 0 TeXcolorrgb 3317 4625 a
 SDict begin H.S end
- 818 4725 a 0 1 0 TeXcolorrgb
-FA(5)p 0 1 0 TeXcolorrgb 859 4672 a
+ 3317 4625 a 0 1 0
+TeXcolorrgb FA(5)p 0 1 0 TeXcolorrgb 3359 4572 a
 SDict begin H.R end
- 859 4672 a 859 4725
-a
+ 3359
+4572 a 3359 4625 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.clark99distributed) cvn H.B /ANN pdfmark end
- 859 4725 a Black FA(].)h(CHK)e(stands)h(for)g(Con)n(ten)n(t)f(Hash)h
-(Key;)g(in)g(other)f(w)n(ords,)g(the)h(con)n(ten)n(t)g(is)523
-4825 y(encrypted)25 b(with)g(a)f(k)n(ey)g(that)h(is)g(deriv)n(ed)f
-(from)g(a)g(cryptographic)f(hash)h(of)h(the)g(plain)n(text.)523
-4924 y(The)38 b(encrypted)f(con)n(ten)n(t)g(is)h(hashed)f(again)g(to)g
-(obtain)g(the)i(query)d(whic)n(h)i(is)g(used)f(to)p Black
-Black eop end
+ 3359 4625 a Black FA(].)523 4725 y(CHK)21
+b(stands)f(for)h(Con)n(ten)n(t)f(Hash)h(Key;)f(in)h(other)g(w)n(ords,)e
+(the)j(con)n(ten)n(t)e(is)h(encrypted)f(with)523 4825
+y(a)26 b(k)n(ey)f(that)i(is)f(deriv)n(ed)f(from)h(a)f(cryptographic)g
+(hash)g(of)h(the)h(plain)n(text.)f(The)g(encrypted)523
+4924 y(con)n(ten)n(t)d(is)g(hashed)f(again)g(to)h(obtain)g(the)g(query)
+g(whic)n(h)g(is)g(used)g(to)f(request)h(the)g(con)n(ten)n(t.)p
+Black Black eop end
 %%Page: 3 3
 TeXDict begin 3 2 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop
@@ -5508,44 +5512,45 @@
 end
  523 232 a Black 1036 w Fx(An)25
 b(Enco)r(ding)h(for)h(Censorship-Resistan)n(t)f(Sharing)238
-b(3)p Black 523 448 a FA(request)25 b(the)i(con)n(ten)n(t.)e(This)h(k)n
-(ey-query)e(pair)h(is)h(what)g(the)g(receiv)n(er)f(needs)h(to)f(do)n
-(wnload)523 548 y(and)i(decrypt)h(the)g(con)n(ten)n(t.)648
-649 y(The)23 b(primary)f(di\013erence)i(to)f(the)h(use)f(of)g(CHK)g(b)n
-(y)h([)p 0 1 0 TeXcolorrgb 2304 649 a
+b(3)p Black 523 448 a FA(This)38 b(k)n(ey-query)e(pair)h(is)h(what)g
+(the)g(receiv)n(er)e(needs)i(to)g(do)n(wnload)e(and)i(decrypt)g(the)523
+548 y(con)n(ten)n(t.)648 649 y(The)23 b(primary)f(di\013erence)i(to)f
+(the)h(use)f(of)g(CHK)g(b)n(y)h([)p 0 1 0 TeXcolorrgb
+2304 649 a
 SDict begin H.S end
- 2304 649 a 0 1 0
-TeXcolorrgb FA(5)p 0 1 0 TeXcolorrgb 2345 596 a
+ 2304 649 a 0 1 0 TeXcolorrgb FA(5)p 0 1 0
+TeXcolorrgb 2345 596 a
 SDict begin H.R end
- 2345
-596 a 2345 649 a
+ 2345 596 a 2345 649 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.clark99distributed) cvn H.B /ANN pdfmark end
- 2345 649 a Black FA(])g(is)f(that)h(ECRS)f(nev)n(er)f
-(sub)5 b(jects)523 749 y(en)n(tire)35 b(\014les)h(to)f(the)h(CHK)f
-(enco)r(ding.)g(Instead,)h(\014les)f(are)g(split)h(in)n(to)f
-(\014xed-size)g(blo)r(c)n(ks)523 849 y(whic)n(h)j(could)f(then)h(b)r(e)
-g(individually)g(distributed)g(\(and)g(replicated\))f(across)f(p)r
-(eers)h(in)523 948 y(the)27 b(net)n(w)n(ork.)e(This)i(is)f(a)g(natural)
-g(w)n(a)n(y)f(to)i(balance)f(the)h(load)e(and)i(to)f(enable)h(sw)n
-(arming.)523 1048 y(The)i(blo)r(c)n(ks)g(can)f(b)r(e)i(individually)f
-(iden)n(ti\014ed)g(b)n(y)g(a)g(query)-7 b(,)28 b(encrypted,)h
-(decrypted)g(and)523 1148 y(v)n(eri\014ed.)39 b(V)-7
-b(eri\014cation)38 b(of)i(an)f(encrypted)g(blo)r(c)n(k)g(is)g
-(accomplished)g(b)n(y)g(c)n(hec)n(king)f(that)523 1247
-y(it)g(matc)n(hes)f(a)h(giv)n(en)f(query)-7 b(.)37 b(This)h(v)n
-(eri\014cation)e(only)h(requires)g(the)h(encrypted)g(blo)r(c)n(k)523
-1347 y(and)30 b(the)g(query;)g(it)g(do)r(es)g(not)g(rev)n(eal)f(the)h
-(k)n(ey)f(required)g(to)h(decrypt)g(the)h(blo)r(c)n(k.)e(ECRS)523
-1446 y(guaran)n(tees)23 b(that)j(it)g(is)g(hard)f(to)g(forge)g(a)g
-(resp)r(onse)f(that)i(passes)e(v)n(eri\014cation)h(for)g(a)g(giv)n(en)
-523 1546 y(query)-7 b(.)30 b(Splitting)h(\014les)f(in)n(to)g(blo)r(c)n
-(ks)f(allo)n(ws)g(ECRS)h(to)g(detect)h(data)f(corruption)f(on)h(the)523
-1646 y(blo)r(c)n(k)i(lev)n(el.)g(Malicious)f(p)r(eers)h(cannot)g
-(transmit)g(more)f(than)i(the)f(selected)h(blo)r(c)n(k)e(size)523
-1745 y(of)d(in)n(v)-5 b(alid)27 b(data)g(b)r(efore)h(b)r(eing)f
-(detected.)648 1847 y(The)18 b(second)h(primitiv)n(e)f(used)h(b)n(y)f
-(ECRS,)h(the)g Ft(KBlo)l(ck)p FA(,)h(is)f(completely)f(no)n(v)n(el.)g
+ 2345 649
+a Black FA(])g(is)f(that)h(ECRS)f(nev)n(er)f(sub)5 b(jects)523
+749 y(en)n(tire)35 b(\014les)h(to)f(the)h(CHK)f(enco)r(ding.)g
+(Instead,)h(\014les)f(are)g(split)h(in)n(to)f(\014xed-size)g(blo)r(c)n
+(ks)523 849 y(whic)n(h)j(could)f(then)h(b)r(e)g(individually)g
+(distributed)g(\(and)g(replicated\))f(across)f(p)r(eers)h(in)523
+948 y(the)27 b(net)n(w)n(ork.)e(This)i(is)f(a)g(natural)g(w)n(a)n(y)f
+(to)i(balance)f(the)h(load)e(and)i(to)f(enable)h(sw)n(arming.)523
+1048 y(The)40 b(blo)r(c)n(ks)f(can)h(b)r(e)g(individually)g(iden)n
+(ti\014ed,)h(encrypted,)e(decrypted)h(and)g(v)n(eri\014ed.)523
+1148 y(Eac)n(h)c(blo)r(c)n(k)h(is)g(iden)n(ti\014ed)g(b)n(y)g(one)g(or)
+f(t)n(w)n(o)h(hash)g(co)r(des.)f(The)i(blo)r(c)n(ks)e(are)g(encrypted)
+523 1247 y(using)g(a)f(k)n(ey)g(that)h(is)g(indep)r(enden)n(t)h(of)f
+(the)g(hashes)f(used)h(for)f(iden)n(ti\014cation.)h(Finally)-7
+b(,)523 1347 y(v)n(eri\014cation)28 b(only)h(requires)f(the)i
+(encrypted)f(blo)r(c)n(k)g(and)g(the)h(query;)f(it)h(do)r(es)f(not)h
+(rev)n(eal)523 1446 y(the)d(k)n(ey)f(required)g(to)h(decrypt)g(the)g
+(blo)r(c)n(k.)f(ECRS)h(guaran)n(tees)e(that)i(it)g(is)g(hard)f(to)h
+(forge)523 1546 y(a)32 b(resp)r(onse)f(that)i(passes)e(v)n
+(eri\014cation)g(for)h(a)g(giv)n(en)g(query)-7 b(.)31
+b(Splitting)i(\014les)g(in)n(to)f(blo)r(c)n(ks)523 1646
+y(allo)n(ws)19 b(ECRS)i(to)f(detect)h(data)f(corruption)g(on)g(the)h
+(blo)r(c)n(k)f(lev)n(el.)g(Malicious)g(p)r(eers)g(cannot)523
+1745 y(transmit)k(more)g(than)h(the)f(selected)h(blo)r(c)n(k)f(size)g
+(of)g(in)n(v)-5 b(alid)25 b(data)f(b)r(efore)g(b)r(eing)g(detected.)648
+1847 y(The)18 b(second)h(primitiv)n(e)f(used)h(b)n(y)f(ECRS,)h(the)g
+Ft(KBlo)l(ck)p FA(,)h(is)f(completely)f(no)n(v)n(el.)g
 Ft(KBlo)l(ck)p FA(s)523 1946 y(allo)n(w)h(users)g(to)h(securely)g
 (obtain)f(the)i(k)n(ey-query)d(pair)i(starting)f(with)i(a)e(natural)h
 (language)523 2046 y(k)n(eyw)n(ord)f(selected)h(b)n(y)g(the)h(con)n
@@ -5568,27 +5573,27 @@
 (public)i(k)n(eys)f(to)g(sign)g(con)n(ten)n(t)g(adv)n(ertisemen)n(ts.)f
 (Using)523 2445 y Ft(KBlo)l(ck)p FA(s,)e(do)r(cumen)n(ts)g(can)e(b)r(e)
 i(inserted)f(under)g(m)n(ultiple)h(k)n(eys)e(at)i(a)e(minimal)i(cost)f
-(in)523 2544 y(space.)18 b(Users)g(can)h(p)r(erform)f(b)r(o)r(olean)h
-(searc)n(hes)e(of)h(the)i(form)e Fs(a)43 b(AND)g(b)18
-b FA(whic)n(h)h(then)g(return)523 2644 y(the)j(do)r(cumen)n(ts)g(whic)n
-(h)g(w)n(ere)f(inserted)g(under)h(a)f(matc)n(hing)g(set)h(of)g(k)n(eyw)
-n(ords.)e(Before)h(the)523 2743 y(do)n(wnload,)30 b(the)h(user)f(can)g
-(re\014ne)g(the)h(searc)n(h)f(results)g(using)g(the)h(metadata)f(asso)r
-(ciated)523 2843 y(with)e(the)g(\014le.)648 2945 y(The)e(rest)f(of)i
-(the)f(pap)r(er)g(is)g(organized)e(as)i(follo)n(ws.)f(Section)p
-1 0 0 TeXcolorrgb 2582 2945 a
+(in)523 2544 y(terms)28 b(of)h(space.)f(Users)g(can)g(p)r(erform)g(b)r
+(o)r(olean)g(searc)n(hes)f(of)i(the)g(form)f Fs(a)43
+b(AND)g(b)28 b FA(whic)n(h)523 2644 y(then)36 b(return)f(the)h(do)r
+(cumen)n(ts)g(whic)n(h)f(w)n(ere)g(inserted)g(under)h(a)f(matc)n(hing)g
+(set)g(of)h(k)n(ey-)523 2743 y(w)n(ords.)i(Before)f(the)j(do)n(wnload,)
+d(the)i(user)g(can)f(re\014ne)g(the)i(searc)n(h)d(results)h(using)h
+(the)523 2843 y(metadata)27 b(asso)r(ciated)f(with)i(the)g(\014le.)648
+2945 y(The)e(rest)f(of)i(the)f(pap)r(er)g(is)g(organized)e(as)i(follo)n
+(ws.)f(Section)p 1 0 0 TeXcolorrgb 2582 2945 a
 SDict begin H.S end
- 2582 2945 a 1 0 0 TeXcolorrgb
-FA(2)p 1 0 0 TeXcolorrgb 2624 2891 a
+ 2582 2945
+a 1 0 0 TeXcolorrgb FA(2)p 1 0 0 TeXcolorrgb 2624 2891
+a
 SDict begin H.R end
- 2624 2891 a 2624
-2945 a
+ 2624 2891 a 2624 2945 a
 SDict begin [ /Color [1 0 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (section.1.2) cvn H.B /ANN pdfmark end
- 2624 2945 a Black 26 w FA(con)n(trasts)f(the)j(curren)n(t)523
-3044 y(w)n(ork)e(with)i(mec)n(hanisms)e(used)h(in)h(other)f
-(censorship-resistan)n(t)d(systems.)j(Section)p 1 0 0
-TeXcolorrgb 3226 3044 a
+ 2624 2945 a Black 26 w FA(con)n(trasts)f(the)
+j(curren)n(t)523 3044 y(w)n(ork)e(with)i(mec)n(hanisms)e(used)h(in)h
+(other)f(censorship-resistan)n(t)d(systems.)j(Section)p
+1 0 0 TeXcolorrgb 3226 3044 a
 SDict begin H.S end
  3226 3044 a 1 0 0 TeXcolorrgb
 FA(3)p 1 0 0 TeXcolorrgb 3268 2991 a
@@ -5609,18 +5614,18 @@
 SDict begin [ /Color [1 0 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (section.1.4) cvn H.B /ANN pdfmark end
  2517 3144 a Black 29 w FA(lists)h(some)f(extensions)f(to)523
-3243 y(the)h(basic)e(sc)n(heme.)h(Finally)-7 b(,)28 b(section)p
-1 0 0 TeXcolorrgb 1760 3243 a
+3243 y(the)f(basic)g(sc)n(heme.)g(Finally)-7 b(,)27 b(Section)p
+1 0 0 TeXcolorrgb 1768 3243 a
 SDict begin H.S end
- 1760 3243 a 1 0 0 TeXcolorrgb
-FA(5)p 1 0 0 TeXcolorrgb 1802 3190 a
+ 1768 3243 a 1 0 0 TeXcolorrgb
+FA(5)p 1 0 0 TeXcolorrgb 1809 3190 a
 SDict begin H.R end
- 1802 3190 a 1802
+ 1809 3190 a 1809
 3243 a
 SDict begin [ /Color [1 0 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (section.1.5) cvn H.B /ANN pdfmark end
- 1802 3243 a Black 28 w FA(discusses)f(attac)n(ks)g(on)h(ECRS)g
-(and)g(con)n(trasts)f(it)523 3343 y(to)h(previous)e(w)n(ork.)648
+ 1809 3243 a Black 27 w FA(discusses)g(attac)n(ks)f(on)g(ECRS)h
+(and)g(con)n(trasts)f(it)523 3343 y(to)i(previous)e(w)n(ork.)648
 3445 y(This)e(w)n(ork)f(builds)h(on)g(our)g(earlier)f(pap)r(er)h([)p
 0 1 0 TeXcolorrgb 2036 3445 a
 SDict begin H.S end
@@ -5632,22 +5637,21 @@
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.esed) cvn H.B /ANN pdfmark end
  2077 3445 a Black FA(])h(whic)n(h)f(w)n(as)f(\014rst)h
-(published)h(at)f(A)n(CISP)523 3544 y(2001.)e(Since)h(then,)h(the)g
-(enco)r(ding)f(sc)n(heme)g(has)g(b)r(een)h(revised)e(to)i(address)e
-(additional)h(re-)523 3644 y(quiremen)n(ts,)g(to)g(impro)n(v)n(e)e(the)
-j(securit)n(y)e(in)h(v)-5 b(arious)22 b(asp)r(ects)h(and)g(to)g(meet)g
-(issues)g(related)523 3743 y(to)28 b(a)f(b)r(etter)h(implemen)n
-(tation.)f(This)h(pap)r(er)f(re\015ects)g(these)h(c)n(hanges.)523
-3916 y
+(published)h(at)f(A)n(CISP)523 3544 y(2001.)33 b(Since)h(then,)h(the)g
+(enco)r(ding)f(sc)n(heme)g(has)g(b)r(een)h(revised)e(to)h(address)g
+(additional)523 3644 y(requiremen)n(ts)29 b(an)h(to)h(impro)n(v)n(e)e
+(the)i(securit)n(y)e(in)i(v)-5 b(arious)29 b(asp)r(ects.)h(This)h(pap)r
+(er)f(re\015ects)523 3743 y(these)e(c)n(hanges.)523 3916
+y
 SDict begin H.S end
  523 3916 a 523 3916 a
 SDict begin 12 H.A end
  523 3916 a 523 3916 a
 SDict begin [ /View [/XYZ H.V] /Dest (section.1.2) cvn H.B /DEST pdfmark
 end
- 523
-3916 a 102 x Fu(2)112 b(Related)38 b(W)-9 b(ork)523 4227
-y FA(A)40 b(large)f(n)n(um)n(b)r(er)g(of)h(censorship-resistan)n(t)d
+ 523 3916
+a 102 x Fu(2)112 b(Related)38 b(W)-9 b(ork)523 4227 y
+FA(A)40 b(large)f(n)n(um)n(b)r(er)g(of)h(censorship-resistan)n(t)d
 (\(or)j(at)f(least)h(fault-toleran)n(t\))f(publishing)523
 4327 y(systems)30 b(ha)n(v)n(e)f(b)r(een)h(prop)r(osed)f(in)i(recen)n
 (t)e(y)n(ears)g([)p 0 1 0 TeXcolorrgb 2170 4327 a
@@ -5663,21 +5667,21 @@
 0 1 0 TeXcolorrgb 2234 4327 a
 SDict begin H.S end
  2234 4327 a 0 1 0 TeXcolorrgb
-FA(5)p 0 1 0 TeXcolorrgb 2276 4273 a
+FA(4)p 0 1 0 TeXcolorrgb 2276 4273 a
 SDict begin H.R end
  2276 4273 a 2276
 4327 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
-(cite.clark99distributed) cvn H.B /ANN pdfmark end
+(cite.chen99prototype) cvn H.B /ANN pdfmark end
  2276 4327 a Black FA(,)p 0 1 0 TeXcolorrgb 2299
 4327 a
 SDict begin H.S end
- 2299 4327 a 0 1 0 TeXcolorrgb FA(4)p 0 1 0 TeXcolorrgb
+ 2299 4327 a 0 1 0 TeXcolorrgb FA(5)p 0 1 0 TeXcolorrgb
 2341 4273 a
 SDict begin H.R end
  2341 4273 a 2341 4327 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
-(cite.chen99prototype) cvn H.B /ANN pdfmark end
+(cite.clark99distributed) cvn H.B /ANN pdfmark end
  2341 4327 a Black
 FA(,)p 0 1 0 TeXcolorrgb 2364 4327 a
 SDict begin H.S end
@@ -5806,9 +5810,9 @@
 (k)n(eep)g(con)n(ten)n(t)g(directly)g(accessible)f(on)h(the)h(host,)f
 (a)g(lo)r(cal)g(cop)n(y)523 1481 y(of)h(the)g(plain)n(text)g(m)n(ust)g
 (b)r(e)g(k)n(ept)f(in)h(addition)g(to)g(the)g(encrypted)f(con)n(ten)n
-(t)h(in)g(the)g(F)-7 b(reenet)523 1581 y(database.)22
-b(Also,)i(F)-7 b(reenet)23 b(do)r(es)g(not)h(supp)r(ort)f(sw)n(arming.)
-f(One)h(reason)f(certainly)g(is)i(that)523 1680 y(F)-7
+(t)h(in)g(the)g(F)-7 b(reenet)523 1581 y(database.)27
+b(Also,)h(F)-7 b(reenet)29 b(do)r(es)f(not)g(supp)r(ort)g(sw)n(arming.)
+f(One)h(reason)f(for)h(this)g(is)h(that)523 1680 y(F)-7
 b(reenet's)30 b(CHK)h(enco)r(ding)f(can)g(only)g(v)n(erify)g(a)g
 (\014le)h(in)f(its)h(en)n(tiret)n(y)f(and)g(not)h(pin-p)r(oin)n(t)523
 1780 y(corruptions)26 b(on)h(a)h(smaller)e(scale.)648
@@ -5856,23 +5860,22 @@
 (b)n(y)f(using)h(incremen)n(tal)f(n)n(um)n(b)r(ers)g(as)g(parts)g(of)h
 (k)n(eyw)n(ords)e(in)523 4071 y(signed)f(namespaces.)g(The)h(disadv)-5
 b(an)n(tage)28 b(of)i(k)n(eyserv)n(ers)d(is)j(that)g(they)g(m)n(ust)g
-(b)r(e)g(main-)523 4171 y(tained)39 b(if)g(the)h(indexed)e(k)n(eys)g
-(are)g(to)h(b)r(e)g(k)n(ept)g(up-to-date.)f(F)-7 b(reenet)39
-b(do)r(es)f(not)h(seem)523 4270 y(to)c(use)g(an)n(y)g(encryption)f(for)
-h(the)h(data)f(stored)f(in)h(KSK)g(or)f(SKS)i(k)n(eys)e(and)h
-(therefore)523 4370 y(fails)27 b(to)h(prev)n(en)n(t)e(in)n
-(termediaries)g(from)h(learning)g(the)h(CHK)f(k)n(eys)f(\(and)i(for)f
-(KSKs)f(ev)n(en)523 4470 y(tamp)r(ering)h(with)h(the)g(CHK)g(k)n
-(eys\),)f(making)g(censorship)f(b)n(y)h(in)n(termediaries)g(easier.)523
-4610 y
+(b)r(e)g(main-)523 4171 y(tained)h(if)g(the)g(indexed)g(k)n(eys)f(are)g
+(to)h(b)r(e)g(k)n(ept)f(up-to-date.)h(F)-7 b(reenet)30
+b(do)r(es)h(not)g(seem)f(to)523 4270 y(use)g(an)n(y)f(encryption)h(for)
+f(the)i(data)f(stored)f(in)h(KSK)g(or)f(SKS)h(k)n(eys)f(and)h
+(therefore)f(fails)523 4370 y(to)36 b(prev)n(en)n(t)f(in)n
+(termediaries)g(from)g(learning)g(the)h(CHK)g(k)n(eys,)f(making)h
+(censorship)e(b)n(y)523 4470 y(in)n(termediaries)26 b(easier.)523
+4589 y
 SDict begin H.S end
- 523 4610 a 523 4610 a
+ 523 4589 a 523 4589 a
 SDict begin 12 H.A end
- 523 4610 a 523 4610 a
+ 523 4589 a 523 4589 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.2.2) cvn H.B /DEST
 pdfmark end
  523
-4610 a 79 x Fr(2.2)95 b(F)-8 b(ree)31 b(Ha)m(v)m(en)523
+4589 a 100 x Fr(2.2)95 b(F)-8 b(ree)31 b(Ha)m(v)m(en)523
 4825 y FA(In)24 b(F)-7 b(ree)24 b(Ha)n(v)n(en)f([)p 0 1 0
 TeXcolorrgb 1074 4825 a
 SDict begin H.S end
@@ -5917,139 +5920,138 @@
  1015
 448 a Black FA(].)g(T)-7 b(o)30 b(retriev)n(e)f(a)g(do)r(cumen)n(t,)i
 (the)g(user)e(m)n(ust)h(obtain)g(the)h(k)n(ey)f(that)g(w)n(as)523
-548 y(used)21 b(to)g(sign)g(the)g(do)r(cumen)n(t)h(from)f(some)f
-(source)g(outside)h(the)h(F)-7 b(ree)21 b(Ha)n(v)n(en)f(net)n(w)n(ork,)
-g(the)523 648 y(design)32 b(itself)i(do)r(es)e(not)h(discuss)f(an)n(y)g
-(searc)n(h)f(functionalit)n(y)-7 b(.)33 b(The)g(user)f(then)h(forw)n
-(ards)523 747 y(the)28 b(k)n(ey)f(to)g(the)h(serv)n(er)e(whic)n(h)i
-(encrypts)f(and)g(sends)h(its)f(share)g(of)g(the)h(do)r(cumen)n(t.)648
-848 y(Shares)21 b(are)g(enco)r(ded)i(with)g(an)f(information)g(disp)r
-(ersal)f(algorithm)g(\(ID)n(A\).)j(Hosts)e(are)523 948
-y(still)34 b(able)f(to)h(exercise)e(editorial)h(con)n(trol)f(o)n(v)n
-(er)g(the)i(con)n(ten)n(t)f(since)h(the)g(ID)n(A)g(do)r(es)f(not)523
-1047 y(prev)n(en)n(t)f(hosts)f(from)h(deco)r(ding)g(parts)g(of)g(the)h
+548 y(used)j(to)f(sign)g(the)h(do)r(cumen)n(t)g(from)f(some)g(source)f
+(outside)i(the)g(F)-7 b(ree)32 b(Ha)n(v)n(en)f(net)n(w)n(ork.)523
+648 y(The)i(design)f(of)g(F)-7 b(ree)32 b(Ha)n(v)n(en)g(itself)h(do)r
+(es)f(not)h(discuss)f(an)n(y)f(searc)n(h)g(functionalit)n(y)-7
+b(.)33 b(The)523 747 y(user)d(then)h(forw)n(ards)e(the)i(k)n(ey)g(to)f
+(the)h(serv)n(er)e(whic)n(h)i(encrypts)f(and)h(sends)f(its)h(share)f
+(of)523 847 y(the)e(do)r(cumen)n(t.)648 948 y(Shares)21
+b(are)g(enco)r(ded)i(with)g(an)f(information)g(disp)r(ersal)f
+(algorithm)g(\(ID)n(A\).)j(Hosts)e(are)523 1047 y(still)34
+b(able)f(to)h(exercise)e(editorial)h(con)n(trol)f(o)n(v)n(er)g(the)i
+(con)n(ten)n(t)f(since)h(the)g(ID)n(A)g(do)r(es)f(not)523
+1147 y(prev)n(en)n(t)f(hosts)f(from)h(deco)r(ding)g(parts)g(of)g(the)h
 (plain)n(text.)f(Also,)g(the)h Fq(k)i FA(out)e(of)f Fq(n)g
-FA(share)523 1147 y(reconstruction)f(sc)n(heme)g(do)r(es)h(not)g(allo)n
+FA(share)523 1247 y(reconstruction)f(sc)n(heme)g(do)r(es)h(not)g(allo)n
 (w)f(reconstruction)f(of)i(a)g(\014le)g(b)n(y)g(mixing)f(shares)523
-1247 y(from)c(indep)r(enden)n(t)i(insertions)e(with)h(di\013eren)n(t)f
+1346 y(from)c(indep)r(enden)n(t)i(insertions)e(with)h(di\013eren)n(t)f
 (v)-5 b(alues)28 b(for)f Fq(k)j FA(or)d Fq(n)p FA(.)523
-1417 y
+1517 y
 SDict begin H.S end
- 523 1417 a 523 1417 a
+ 523 1517 a 523 1517 a
 SDict begin 12 H.A end
- 523 1417 a 523 1417 a
+ 523 1517 a 523 1517 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.2.3) cvn H.B /DEST
 pdfmark end
  523
-1417 a 85 x Fr(2.3)95 b(Mnet)31 b(and)h(Mo)5 b(jo)32
-b(Nation)523 1675 y FA(Mnet)d(is)f(the)g(successor)f(of)h(Mo)5
-b(jo)27 b(Nation)h([)p 0 1 0 TeXcolorrgb 1938 1675 a
+1517 a 85 x Fr(2.3)95 b(Mnet)31 b(and)h(Mo)5 b(jo)32
+b(Nation)523 1774 y FA(Mnet)d(is)f(the)g(successor)f(of)h(Mo)5
+b(jo)27 b(Nation)h([)p 0 1 0 TeXcolorrgb 1938 1774 a
 SDict begin H.S end
 
-1938 1675 a 0 1 0 TeXcolorrgb FA(30)p 0 1 0 TeXcolorrgb
-2021 1621 a
+1938 1774 a 0 1 0 TeXcolorrgb FA(30)p 0 1 0 TeXcolorrgb
+2021 1721 a
 SDict begin H.R end
- 2021 1621 a 2021 1675 a
+ 2021 1721 a 2021 1774 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.mojotech) cvn H.B /ANN pdfmark end
- 2021 1675 a Black
+ 2021 1774 a Black
 FA(],)h(a)e(p)r(eer-to-p)r(eer)g(net)n(w)n(ork)g(that)h(w)n(as)g(the)
-523 1774 y(\014rst)d(to)g(fo)r(cus)g(on)f(using)h(economic)f(incen)n
+523 1874 y(\014rst)d(to)g(fo)r(cus)g(on)f(using)h(economic)f(incen)n
 (tiv)n(es)g(when)h(trading)g(con)n(ten)n(t.)f(As)h(the)h(descen-)523
-1874 y(dan)n(t)g(of)g(a)g(commercial)f(pro)r(duct,)i(Mnet)f(fo)r(cuses)
+1974 y(dan)n(t)g(of)g(a)g(commercial)f(pro)r(duct,)i(Mnet)f(fo)r(cuses)
 g(mostly)g(on)g(e\016ciency)h(and)f(reliabilit)n(y)-7
-b(.)523 1974 y(Nev)n(ertheless,)34 b(Mnet)i(encrypts)f(\014les)g(with)g
-(AES)h(using)e(a)h(user-supplied)g(k)n(ey)f(seed)h(to)523
-2073 y(allo)n(w)24 b(for)g(priv)-5 b(acy)e(.)24 b(The)g(\014le)h(is)g
-(then)g(brok)n(en)e(in)n(to)i(shares)e(using)h(an)h(erasure)d(co)r(de.)
-j(Mul-)523 2173 y(tiple)30 b(shares)e(are)h(iden)n(ti\014ed)h(with)g
-(an)g(SHA-1)f(hash)h(and)f(stored)g(in)h(an)f(ino)r(de.)h(The)g(\014le)
-523 2272 y(can)d(b)r(e)g(retriev)n(ed)f(using)h(the)h(hash)f(of)g(the)g
-(ino)r(de)h(and)f(the)g(symmetric)g(encryption)g(k)n(ey)-7
-b(.)648 2373 y(The)30 b(use)g(of)g(whole-\014le)f(AES)h(encryption)g
-(and)g(the)g(use)g(of)g(an)g(erasure)e(co)r(de)i(forces)523
-2473 y(Mnet,)25 b(just)f(lik)n(e)g(F)-7 b(reenet,)24
-b(to)g(store)f(a)h(second)f(cop)n(y)g(of)h(the)g(en)n(tire)g(\014le)g
-(in)h(the)f(Mnet)g(data)523 2573 y(store)h(ev)n(en)h(if)g(the)g(user)g
-(retains)f(a)h(cop)n(y)f(of)h(the)g(\014le)g(in)g(plain)n(text.)g(The)g
-(enco)r(ding)g(mak)n(es)523 2672 y(it)h(infeasible)f(to)g(enco)r(de)g
-(parts)f(of)i(the)f(\014le)h(on)f(request.)f(The)h(free)g(selection)g
-(of)g(the)h(AES)523 2772 y(k)n(ey)j(allo)n(ws)f(indep)r(enden)n(t)j
-(users)d(to)i(create)f(completely)g(di\013eren)n(t)h(shares)e(for)h
-(iden)n(tical)523 2871 y(\014les.)35 b(Since)g(the)h(encryption)e(of)h
-(the)g(con)n(ten)n(t)g(is)g(a)f(p)r(erfectly)i(indep)r(enden)n(t)g
-(pass)e(o)n(v)n(er)523 2971 y(the)e(\014le,)g(other)e(enco)r(dings)h
-(suc)n(h)g(as)g(ECRS)g(and)g(F)-7 b(reenet's)32 b(enco)r(ding)f(could)g
-(b)r(e)h(easily)523 3071 y(extended)i(to)g(include)h(this)f(b)r(eha)n
-(vior)e(if)j(desired)e({)h(without)g(the)h(need)f(to)g(mandate)f(a)523
-3170 y(certain)27 b(st)n(yle)g(of)h(AES)f(encryption.)523
-3341 y
+b(.)523 2073 y(Nev)n(ertheless,)31 b(Mnet)i(encrypts)e(\014les)h(with)h
+(AES)f(using)g(a)f(user-supplied)h(k)n(ey)f(to)h(allo)n(w)523
+2173 y(for)e(priv)-5 b(acy)e(.)30 b(The)h(\014le)g(is)f(then)h(brok)n
+(en)f(in)n(to)g(shares)f(using)h(an)h(erasure)e(co)r(de.)h(Multiple)523
+2272 y(shares)23 b(are)h(iden)n(ti\014ed)g(with)h(an)g(SHA-1)f(hash)g
+(and)g(stored)g(in)h(an)f(ino)r(de.)g(The)h(\014le)g(can)f(b)r(e)523
+2372 y(retriev)n(ed)i(using)i(the)g(hash)f(of)g(the)h(ino)r(de)g(and)f
+(the)h(symmetric)g(encryption)f(k)n(ey)-7 b(.)648 2473
+y(The)30 b(use)g(of)g(whole-\014le)f(AES)h(encryption)g(and)g(the)g
+(use)g(of)g(an)g(erasure)e(co)r(de)i(forces)523 2573
+y(Mnet,)25 b(just)f(lik)n(e)g(F)-7 b(reenet,)24 b(to)g(store)f(a)h
+(second)f(cop)n(y)g(of)h(the)g(en)n(tire)g(\014le)g(in)h(the)f(Mnet)g
+(data)523 2672 y(store)h(ev)n(en)h(if)g(the)g(user)g(retains)f(a)h(cop)
+n(y)f(of)h(the)g(\014le)g(in)g(plain)n(text.)g(The)g(enco)r(ding)g(mak)
+n(es)523 2772 y(it)h(infeasible)f(to)g(enco)r(de)g(parts)f(of)i(the)f
+(\014le)h(on)f(request.)f(The)h(free)g(selection)g(of)g(the)h(AES)523
+2871 y(k)n(ey)j(allo)n(ws)f(indep)r(enden)n(t)j(users)d(to)i(create)f
+(completely)g(di\013eren)n(t)h(shares)e(for)h(iden)n(tical)523
+2971 y(\014les.)35 b(Since)g(the)h(encryption)e(of)h(the)g(con)n(ten)n
+(t)g(is)g(a)f(p)r(erfectly)i(indep)r(enden)n(t)g(pass)e(o)n(v)n(er)523
+3071 y(the)e(\014le,)g(other)e(enco)r(dings)h(suc)n(h)g(as)g(ECRS)g
+(and)g(F)-7 b(reenet's)32 b(enco)r(ding)f(could)g(b)r(e)h(easily)523
+3170 y(extended)i(to)g(include)h(this)f(b)r(eha)n(vior)e(if)j(desired)e
+({)h(without)g(the)h(need)f(to)g(mandate)f(a)523 3270
+y(certain)27 b(st)n(yle)g(of)h(AES)f(encryption.)523
+3441 y
 SDict begin H.S end
- 523 3341 a 523 3341 a
+ 523 3441 a 523 3441 a
 SDict begin 12 H.A end
- 523 3341 a 523 3341 a
+ 523 3441 a 523 3441 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.2.4) cvn H.B /DEST
 pdfmark end
  523
-3341 a 85 x Fr(2.4)95 b(Publius)523 3598 y FA(Publius)23
-b([)p 0 1 0 TeXcolorrgb 843 3598 a
+3441 a 85 x Fr(2.4)95 b(Publius)523 3698 y FA(Publius)23
+b([)p 0 1 0 TeXcolorrgb 843 3698 a
 SDict begin H.S end
- 843 3598 a 0 1 0 TeXcolorrgb
-FA(29)p 0 1 0 TeXcolorrgb 926 3545 a
+ 843 3698 a 0 1 0 TeXcolorrgb
+FA(29)p 0 1 0 TeXcolorrgb 926 3645 a
 SDict begin H.R end
- 926 3545 a 926 3598
+ 926 3645 a 926 3698
 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.pub00) cvn H.B /ANN pdfmark end
- 926 3598 a Black FA(])h(is)g(a)f(static)g(net)n(w)n(ork)f(that)i
+ 926 3698 a Black FA(])h(is)g(a)f(static)g(net)n(w)n(ork)f(that)i
 (uses)f(Shamir's)g(algorithm)g([)p 0 1 0 TeXcolorrgb
-2736 3598 a
+2736 3698 a
 SDict begin H.S end
- 2736 3598 a 0 1 0 TeXcolorrgb FA(24)p 0 1 0
-TeXcolorrgb 2819 3545 a
+ 2736 3698 a 0 1 0 TeXcolorrgb FA(24)p 0 1 0
+TeXcolorrgb 2819 3645 a
 SDict begin H.R end
- 2819 3545 a 2819 3598 a
+ 2819 3645 a 2819 3698 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.shamir) cvn H.B /ANN pdfmark end
  2819
-3598 a Black FA(])g(to)h(split)g(the)g(k)n(ey)523 3698
+3698 a Black FA(])g(to)h(split)g(the)g(k)n(ey)523 3798
 y(required)j(to)g(restore)g(stored)g(\014les)g(b)r(et)n(w)n(een)h(the)g
 (a)n(v)-5 b(ailable)27 b(serv)n(ers.)e(The)j(encrypted)g(\014le)523
-3798 y(is)33 b(then)h(stored)f(on)g(all)g(serv)n(ers.)e(The)j(serv)n
+3897 y(is)33 b(then)h(stored)f(on)g(all)g(serv)n(ers.)e(The)j(serv)n
 (ers)d(cannot)i(decrypt)g(the)h(\014le)f(as)g(the)g(k)n(ey)g(is)523
-3897 y(nev)n(er)27 b(en)n(tirely)g(rev)n(ealed)f(to)h(them.)648
-3998 y(Publius)34 b(k)n(eys)g(are)g(random)g(strings.)g(The)h(system)g
-(do)r(es)g(not)g(pro)n(vide)e(an)n(y)i(searc)n(h)523
-4098 y(mec)n(hanism)c(and)h(exp)r(ects)f(the)h(users)f(to)h(obtain)f
-(the)h(k)n(eys)f(from)g(an)g(alternate)g(source.)523
-4197 y(Publius)d(nev)n(er)e(discards)h(an)n(y)g(con)n(ten)n(t)g(and)h
-(th)n(us)g(assumes)e(that)i(disk)g(space)f(is)h(nev)n(er)e(a)523
-4297 y(limitation.)523 4452 y
+3997 y(nev)n(er)27 b(rev)n(ealed)f(to)h(them.)648 4098
+y(Publius)34 b(k)n(eys)g(are)g(random)g(strings.)g(The)h(system)g(do)r
+(es)g(not)g(pro)n(vide)e(an)n(y)i(searc)n(h)523 4197
+y(mec)n(hanism)c(and)h(exp)r(ects)f(the)h(users)f(to)h(obtain)f(the)h
+(k)n(eys)f(from)g(an)g(alternate)g(source.)523 4297 y(Publius)d(nev)n
+(er)e(discards)h(an)n(y)g(con)n(ten)n(t)g(and)h(th)n(us)g(assumes)e
+(that)i(disk)g(space)f(is)h(nev)n(er)e(a)523 4397 y(limitation.)523
+4551 y
 SDict begin H.S end
- 523 4452 a 523 4452 a
+ 523 4551 a 523 4551 a
 SDict begin 12 H.A end
- 523
-4452 a 523 4452 a
+ 523 4551 a 523 4551 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.2.5) cvn H.B /DEST
 pdfmark end
- 523 4452 a 101 x Fr(2.5)95 b(T)-8 b(angler)523
-4725 y FA(The)31 b(T)-7 b(angler)30 b(net)n(w)n(ork)f([)p
-0 1 0 TeXcolorrgb 1345 4725 a
+ 523
+4551 a 101 x Fr(2.5)95 b(T)-8 b(angler)523 4825 y FA(The)31
+b(T)-7 b(angler)30 b(net)n(w)n(ork)f([)p 0 1 0 TeXcolorrgb
+1345 4825 a
 SDict begin H.S end
- 1345 4725 a 0 1 0 TeXcolorrgb
-FA(28)p 0 1 0 TeXcolorrgb 1428 4672 a
+ 1345 4825 a 0 1 0 TeXcolorrgb FA(28)p 0 1 0
+TeXcolorrgb 1428 4771 a
 SDict begin H.R end
- 1428 4672 a 1428
-4725 a
+ 1428 4771 a 1428 4825 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.waldman2001tangler) cvn H.B /ANN pdfmark end
- 1428 4725 a Black FA(])i(is)g(a)f(system)h(where)f(new)h(con)n
-(ten)n(t)g(is)g(en)n(tangled)f(with)h(old)523 4825 y(con)n(ten)n(t.)22
+ 1428
+4825 a Black FA(])i(is)g(a)f(system)h(where)f(new)h(con)n(ten)n(t)g(is)
+g(en)n(tangled)f(with)h(old)523 4924 y(con)n(ten)n(t.)22
 b(This)g(en)n(tanglemen)n(t)g(in)n(tro)r(duces)g(a)g(dep)r(endency)h
-(that)g(mak)n(es)e(it)i(imp)r(ossible)f(to)523 4924 y(retriev)n(e)i(a)g
-(piece)h(of)g(con)n(ten)n(t)g(if)g(the)g(other)g(con)n(ten)n(t)f(that)h
-(it)h(w)n(as)e(en)n(tangled)g(with)h(is)g(lost.)p Black
-Black eop end
+(that)g(mak)n(es)e(it)i(imp)r(ossible)f(to)p Black Black
+eop end
 %%Page: 6 6
 TeXDict begin 6 5 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop
@@ -6067,207 +6069,169 @@
 end
  523 232 a Black Fx(6)237 b(C.)27
 b(Grotho\013,)f(K.)g(Grotho\013,)g(T.)h(Horozo)n(v,)f(J.T.)h(Lindgren)p
-Black 523 448 a FA(While)20 b(this)h(mak)n(es)d(it)j(imp)r(ossible)e
-(to)h(censor)f(sp)r(eci\014c)h(con)n(ten)n(t)f(without)h(losing)f
-(unrelated)523 548 y(con)n(ten)n(t)j(\(since)h(the)g(en)n(tanglemen)n
-(t)e(pairs)h(are)g(c)n(hosen)f(randomly\),)h(this)h(pro)r(cess)e
-Ft(doubles)523 648 y FA(the)f(amoun)n(t)f(of)g(data)g(that)h(m)n(ust)f
-(b)r(e)h(transp)r(orted)f(b)n(y)g(the)h(net)n(w)n(ork.)e(This)h(sc)n
-(heme)g(fails)g(to)523 747 y(address)29 b(the)i(fact)f(that)h(an)f(adv)
-n(ersary)d(ma)n(y)j(not)g(care)g(ab)r(out)g(losing)f(other)h(data)g
-(when)523 847 y(attempting)35 b(to)g(censor)f(con)n(ten)n(t.)h(Also,)f
+Black 523 448 a FA(retriev)n(e)d(a)g(piece)h(of)g(con)n(ten)n(t)g(if)g
+(the)g(other)g(con)n(ten)n(t)f(that)h(it)h(w)n(as)e(en)n(tangled)g
+(with)h(is)g(lost.)523 548 y(While)20 b(this)h(mak)n(es)d(it)j(imp)r
+(ossible)e(to)h(censor)f(sp)r(eci\014c)h(con)n(ten)n(t)f(without)h
+(losing)f(unrelated)523 648 y(con)n(ten)n(t)j(\(since)h(the)g(en)n
+(tanglemen)n(t)e(pairs)h(are)g(c)n(hosen)f(randomly\),)h(this)h(pro)r
+(cess)e Ft(doubles)523 747 y FA(the)f(amoun)n(t)f(of)g(data)g(that)h(m)
+n(ust)f(b)r(e)h(transp)r(orted)f(b)n(y)g(the)h(net)n(w)n(ork.)e(This)h
+(sc)n(heme)g(fails)g(to)523 847 y(address)29 b(the)i(fact)f(that)h(an)f
+(adv)n(ersary)d(ma)n(y)j(not)g(care)g(ab)r(out)g(losing)f(other)h(data)
+g(when)523 946 y(attempting)35 b(to)g(censor)f(con)n(ten)n(t.)h(Also,)f
 (nothing)h(prev)n(en)n(ts)f(the)h(adv)n(ersary)e(from)h(\014rst)523
-946 y(making)e(a)g(cop)n(y)f(of)h(imp)r(ortan)n(t)g(do)r(cumen)n(ts)h
+1046 y(making)e(a)g(cop)n(y)f(of)h(imp)r(ortan)n(t)g(do)r(cumen)n(ts)h
 (and)f(re-inserting)f(them)h(in)n(to)h(the)f(system)523
-1046 y(after)27 b(the)h(censorship)f(op)r(eration.)648
-1146 y(T)-7 b(angler)22 b(has)h(some)g(similarities)g(with)h(ECRS.)g
+1146 y(after)27 b(the)h(censorship)f(op)r(eration.)648
+1245 y(T)-7 b(angler)22 b(has)h(some)g(similarities)g(with)h(ECRS.)g
 (In)g(particular,)e(it)i(uses)f(hash)g(trees)h(for)523
-1245 y(in)n(tegrit)n(y)h(c)n(hec)n(ks)f(on)i(\014xed-size)f(blo)r(c)n
-(ks)g(of)h(data.)f(The)h(ma)5 b(jor)25 b(di\013erence)g(with)i(ECRS)e
-(is)523 1345 y(that)e(the)g(T)-7 b(angler)21 b(enco)r(ding)i(uses)f
-(Shamir's)g(secret)g(sharing)f([)p 0 1 0 TeXcolorrgb
-2525 1345 a
+1345 y(in)n(tegrit)n(y)h(c)n(hec)n(ks)g(on)g(\014xed-size)h(blo)r(c)n
+(ks)f(of)h(data.)f(A)i(di\013erence)e(with)i(ECRS)f(is)f(that)i(the)523
+1445 y(T)-7 b(angler)33 b(enco)r(ding)h(uses)g(Shamir's)g(secret)g
+(sharing)f([)p 0 1 0 TeXcolorrgb 2283 1445 a
 SDict begin H.S end
- 2525 1345 a 0 1 0 TeXcolorrgb FA(24)p 0 1 0
-TeXcolorrgb 2608 1291 a
+ 2283 1445
+a 0 1 0 TeXcolorrgb FA(24)p 0 1 0 TeXcolorrgb 2366 1391
+a
 SDict begin H.R end
- 2608 1291 a 2608 1345 a
+ 2366 1391 a 2366 1445 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.shamir) cvn H.B /ANN pdfmark end
- 2608
-1345 a Black FA(])i(to)g(en)n(tangle)e(the)j(blo)r(c)n(k)523
-1445 y(with)29 b(other,)e(pre-existing)g(blo)r(c)n(ks,)h(preferably)f
-(from)h(other)f(do)r(cumen)n(ts.)h(Another)g(sim-)523
-1544 y(ilarit)n(y)j(b)r(et)n(w)n(een)g(T)-7 b(angler)31
-b(and)g(ECRS)h(is)f(the)h(existence)g(of)f(cryptographically)e(signed)
-523 1644 y(data,)i(whic)n(h)h(T)-7 b(angler)30 b(calls)h(collections.)g
-(T)-7 b(angler's)30 b(collections)h(are)f(analogous)g(to)h(di-)523
-1743 y(rectories)g(and)h(namespaces)f(in)h(ECRS.)g(The)h(ma)5
-b(jor)31 b(di\013erence)h(is)g(that)h(in)f(T)-7 b(angler,)31
-b(a)523 1843 y(collection)j(has)g(a)g(v)n(ersioned)f(ro)r(ot)h(whic)n
-(h)h(explicitly)f(lists)h(all)f(of)h(the)g(con)n(ten)n(ts)f(in)h(the)
-523 1943 y(collection,)22 b(resulting)h(in)g(one)g(of)g(T)-7
-b(angler's)21 b(global)h(sync)n(hronization)f(problems.)h(Placing)523
-2042 y(a)27 b(do)r(cumen)n(t)h(in)g(an)f(ECRS)h(namespace)e(only)h
-(requires)g(that)g(it)i(b)r(e)f(adequately)e(signed.)523
-2207 y
+ 2366 1445 a Black FA(])h(to)g(en)n(tangle)g
+(the)h(blo)r(c)n(k)e(with)523 1544 y(other,)28 b(pre-existing)g(blo)r
+(c)n(ks,)g(preferably)g(from)g(other)g(do)r(cumen)n(ts.)h(similarit)n
+(y)f(b)r(et)n(w)n(een)523 1644 y(T)-7 b(angler,)34 b(F)-7
+b(reenet)35 b(and)g(ECRS)f(is)h(the)h(existence)e(of)h
+(cryptographically)e(signed)h(data,)523 1744 y(whic)n(h)25
+b(T)-7 b(angler)23 b(calls)h(collections.)g(T)-7 b(angler's)24
+b(collections)g(are)f(analogous)g(to)h(directories)523
+1843 y(and)31 b(namespaces)f(in)h(ECRS.)g(The)h(ma)5
+b(jor)30 b(di\013erence)h(is)g(that)g(in)h(T)-7 b(angler)30
+b(a)h(collection)523 1943 y(has)23 b(a)g(v)n(ersioned)f(ro)r(ot)h(whic)
+n(h)g(explicitly)h(lists)g(all)f(of)g(the)h(con)n(ten)n(ts)f(in)h(the)g
+(collection,)f(re-)523 2042 y(sulting)h(in)h(one)f(of)g(T)-7
+b(angler's)23 b(global)h(sync)n(hronization)e(problems.)i(Placing)f(a)h
+(do)r(cumen)n(t)523 2142 y(in)31 b(a)g(F)-7 b(reenet)31
+b(subspace)f(or)g(ECRS)h(namespace)f(only)h(requires)f(that)h(it)g(b)r
+(e)h(adequately)523 2242 y(signed.)523 2408 y
 SDict begin H.S end
- 523 2207 a 523 2207 a
+ 523 2408
+a 523 2408 a
 SDict begin 12 H.A end
- 523 2207 a 523 2207 a
+ 523 2408 a 523 2408 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.2.6) cvn H.B /DEST
 pdfmark end
- 523
-2207 a 84 x Fr(2.6)95 b(Gn)m(utella)31 b(and)h(F)-8 b(astT)g(rac)m(k)
-523 2456 y FA(The)31 b(F)-7 b(astT)g(rac)n(k)28 b(net)n(w)n(ork)p
-1 0 0 TeXcolorrgb 1376 2456 a
+ 523 2408 a 83 x Fr(2.6)95
+b(Gn)m(utella)31 b(and)h(F)-8 b(astT)g(rac)m(k)523 2658
+y FA(The)31 b(F)-7 b(astT)g(rac)n(k)28 b(net)n(w)n(ork)p
+1 0 0 TeXcolorrgb 1376 2658 a
 SDict begin H.S end
- 1376 2456 a -30 x Fz(1)1412
-2456 y
+ 1376 2658 a -30 x Fz(1)1412
+2658 y
 SDict begin 12 H.L end
- 1412 2456 a 1412 2456 a
+ 1412 2658 a 1412 2658 a
 SDict begin [ /Subtype /Link /Dest (Hfootnote.1) cvn /H /I /Border
 [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end
- 1412 2456 a Black 31 w
+ 1412 2658 a Black 31 w
 FA(and)i(mo)r(dern)g(v)-5 b(arian)n(ts)29 b(of)i(the)g(Gn)n(utella)f
-(proto)r(col)f(use)i(the)523 2556 y(SHA-1)f(hash)f(co)r(de)g(of)h(the)g
+(proto)r(col)f(use)i(the)523 2757 y(SHA-1)f(hash)f(co)r(de)g(of)h(the)g
 (shared)f(\014les)g(to)h(uniquely)f(iden)n(tify)i(\014les.)e(The)h
-(SHA-1)f(hash)523 2656 y(co)r(des)d(are)f(used)i(to)f(iden)n(tify)h
+(SHA-1)f(hash)523 2857 y(co)r(des)d(are)f(used)i(to)f(iden)n(tify)h
 (iden)n(tical)f(\014les)g(stored)g(on)g(di\013eren)n(t)g(p)r(eers.)g
-(The)g(p)r(eers)g(can)523 2755 y(then)d(use)g(this)g(information)f(to)h
+(The)g(p)r(eers)g(can)523 2957 y(then)d(use)g(this)g(information)f(to)h
 (do)n(wnload)f(the)h(\014le)g(from)f(m)n(ultiple)i(sources)d(\(sw)n
-(arming\).)523 2855 y(The)e(problem)f(with)h(this)h(approac)n(h)c(is)j
-(that)g(the)g(SHA-1)g(hash)f(co)r(des)h(can)f(only)h(b)r(e)g(v)n
-(eri\014ed)523 2955 y(once)30 b(the)g(en)n(tire)g(\014le)g(has)f(b)r
-(een)i(retriev)n(ed.)e(T)-7 b(o)29 b(ruin)h(a)g(do)n(wnload,)f(it)h(w)n
-(ould)g(su\016ce)g(for)523 3054 y(a)35 b(malicious)f(p)r(eer)h(to)g
-(pro)n(vide)f(just)i(one)f(single)f(in)n(v)-5 b(alid)35
-b(blo)r(c)n(k.)g(The)g(presence)g(of)g(the)523 3154 y(in)n(v)-5
-b(alid)33 b(blo)r(c)n(k)g(could)g(only)f(b)r(e)i(detected)f(after)g
-(the)h(en)n(tire)e(\014le)i(w)n(as)e(retriev)n(ed.)g(W)-7
-b(orse,)523 3253 y(the)21 b(simplistic)g(SHA-1)g(approac)n(h)e(do)r(es)
-h(not)h(giv)n(e)f(p)r(eers)g(an)n(y)g(w)n(a)n(y)g(to)h(iden)n(tify)g
-(the)g(in)n(v)-5 b(alid)523 3353 y(blo)r(c)n(k)27 b(or)g(the)h
-(malicious)f(p)r(eer.)648 3453 y(Because)i(F)-7 b(astT)g(rac)n(k)29
-b(and)h(Gn)n(utella)h(use)f(neither)g(\014le)h(encryption)f(nor)g(anon)
-n(ymous)523 3552 y(routing)37 b(to)h(hide)g(the)g(address)f(of)h
-(either)f(the)i(receiv)n(er)d(or)h(the)h(sender,)f(they)h(do)g(not)523
-3652 y(tec)n(hnically)23 b(pro)n(vide)f(an)n(y)h(protection)g(from)g
-(censorship)f(b)r(ey)n(ond)h(decen)n(tralized)g(routing)523
-3752 y(of)28 b(requests.)523 3917 y
+(arming\).)523 3056 y(The)41 b(problem)f(with)h(this)f(approac)n(h)f
+(is)h(that)h(the)g(SHA-1)f(hash)g(co)r(des)g(can)h(only)f(b)r(e)523
+3156 y(v)n(eri\014ed)23 b(once)h(the)h(en)n(tire)f(\014le)g(has)g(b)r
+(een)g(retriev)n(ed.)f(T)-7 b(o)24 b(ruin)g(a)g(do)n(wnload,)f(it)i
+(su\016ces)f(for)523 3255 y(a)29 b(malicious)f(p)r(eer)i(to)f(con)n
+(tribute)g(just)h(one)e(single)h(in)n(v)-5 b(alid)29
+b(blo)r(c)n(k.)g(The)h(presence)e(of)h(an)523 3355 y(in)n(v)-5
+b(alid)22 b(blo)r(c)n(k)f(could)g(only)h(b)r(e)g(detected)g(after)f
+(the)h(en)n(tire)g(\014le)f(w)n(as)g(retriev)n(ed.)g(W)-7
+b(orse,)21 b(the)523 3455 y(simplistic)28 b(SHA-1)g(approac)n(h)f(do)r
+(es)g(not)i(giv)n(e)e(p)r(eers)g(an)n(y)h(w)n(a)n(y)f(to)h(iden)n(tify)
+g(the)h(lo)r(cation)523 3554 y(of)f(the)g(in)n(v)-5 b(alid)27
+b(blo)r(c)n(k)g(or)g(the)h(malicious)f(p)r(eer.)648 3654
+y(F)-7 b(astT)g(rac)n(k)19 b(and)j(Gn)n(utella)f(do)g(not)g(use)h
+(neither)f(\014le)g(encryption.)g(Consequen)n(tly)g(they)523
+3754 y(do)30 b(not)g(pro)n(vide)f(an)n(y)g(protection)g(from)h
+(censorship)f(b)r(ey)n(ond)h(decen)n(tralized)f(routing)g(of)523
+3853 y(requests.)523 4019 y
 SDict begin H.S end
- 523 3917 a 523 3917
-a
+ 523 4019 a 523 4019 a
 SDict begin 12 H.A end
- 523 3917 a 523 3917 a
+ 523
+4019 a 523 4019 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.2.7) cvn H.B /DEST
 pdfmark end
- 523 3917 a 83 x Fr(2.7)95 b(Distributed)31
-b(File)f(Systems)523 4166 y FA(V)-7 b(arious)21 b(distributed)i(\014le)
+ 523 4019 a 84 x Fr(2.7)95 b(Distributed)31
+b(File)f(Systems)523 4269 y FA(V)-7 b(arious)21 b(distributed)i(\014le)
 g(systems)f(based)g(on)g(a)g(p)r(eer-to-p)r(eer)f(infrastructure)g(ha)n
-(v)n(e)h(b)r(een)523 4265 y(built)39 b(in)f(recen)n(t)f(y)n(ears)f([)p
-0 1 0 TeXcolorrgb 1342 4265 a
+(v)n(e)h(b)r(een)523 4369 y(built)39 b(in)f(recen)n(t)f(y)n(ears)f([)p
+0 1 0 TeXcolorrgb 1342 4369 a
 SDict begin H.S end
- 1342 4265 a 0 1 0 TeXcolorrgb
-FA(7)p 0 1 0 TeXcolorrgb 1384 4212 a
+ 1342 4369 a 0 1 0 TeXcolorrgb
+FA(7)p 0 1 0 TeXcolorrgb 1384 4315 a
 SDict begin H.R end
- 1384 4212 a 1384
-4265 a
+ 1384 4315 a 1384
+4369 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.cfs:sosp01) cvn H.B /ANN pdfmark end
- 1384 4265 a Black FA(,)p 0 1 0 TeXcolorrgb 1407
-4265 a
+ 1384 4369 a Black FA(,)p 0 1 0 TeXcolorrgb 1407
+4369 a
 SDict begin H.S end
- 1407 4265 a 0 1 0 TeXcolorrgb FA(18)p 0 1 0 TeXcolorrgb
-1490 4212 a
+ 1407 4369 a 0 1 0 TeXcolorrgb FA(17)p 0 1 0 TeXcolorrgb
+1490 4315 a
 SDict begin H.R end
- 1490 4212 a 1490 4265 a
+ 1490 4315 a 1490 4369 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
-(cite.mazieres02building) cvn H.B /ANN pdfmark end
- 1490 4265 a Black
-FA(,)p 0 1 0 TeXcolorrgb 1513 4265 a
+(cite.mazires00sfs) cvn H.B /ANN pdfmark end
+ 1490 4369 a Black
+FA(,)p 0 1 0 TeXcolorrgb 1513 4369 a
 SDict begin H.S end
- 1513 4265 a 0 1 0
-TeXcolorrgb FA(17)p 0 1 0 TeXcolorrgb 1596 4212 a
+ 1513 4369 a 0 1 0
+TeXcolorrgb FA(18)p 0 1 0 TeXcolorrgb 1596 4315 a
 SDict begin H.R end
  1596
-4212 a 1596 4265 a
+4315 a 1596 4369 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
-(cite.mazires00sfs) cvn H.B /ANN pdfmark end
- 1596 4265 a Black FA(,)p 0 1 0 TeXcolorrgb
-1619 4265 a
+(cite.mazieres02building) cvn H.B /ANN pdfmark end
+ 1596 4369 a Black FA(,)p 0 1 0 TeXcolorrgb
+1619 4369 a
 SDict begin H.S end
- 1619 4265 a 0 1 0 TeXcolorrgb FA(21)p 0 1 0
-TeXcolorrgb 1702 4212 a
+ 1619 4369 a 0 1 0 TeXcolorrgb FA(21)p 0 1 0
+TeXcolorrgb 1702 4315 a
 SDict begin H.R end
- 1702 4212 a 1702 4265 a
+ 1702 4315 a 1702 4369 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.muthitacharoen02ivy) cvn H.B /ANN pdfmark end
  1702
-4265 a Black FA(,)p 0 1 0 TeXcolorrgb 1725 4265 a
+4369 a Black FA(,)p 0 1 0 TeXcolorrgb 1725 4369 a
 SDict begin H.S end
  1725
-4265 a 0 1 0 TeXcolorrgb FA(23)p 0 1 0 TeXcolorrgb 1808
-4212 a
+4369 a 0 1 0 TeXcolorrgb FA(23)p 0 1 0 TeXcolorrgb 1808
+4315 a
 SDict begin H.R end
- 1808 4212 a 1808 4265 a
+ 1808 4315 a 1808 4369 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.rowstron01storage) cvn H.B /ANN pdfmark end
- 1808 4265 a Black FA(].)i(These)g
+ 1808 4369 a Black FA(].)i(These)g
 (systems)f(t)n(ypically)h(do)f(not)h(fo)r(cus)g(on)523
-4365 y(censorship-resistance)g(and)j(consequen)n(tly)f(do)g(not)h
-(encrypt)g(the)g(con)n(ten)n(ts.)f(Mo)r(dern)523 4464
-y(systems)26 b(lik)n(e)g([)p 0 1 0 TeXcolorrgb 1004 4464
+4468 y(censorship-resistance)g(and)j(consequen)n(tly)f(do)g(not)h
+(encrypt)g(the)g(con)n(ten)n(ts.)f(Mo)r(dern)p Black
+523 4538 473 4 v 546 4592 a Fy(1)p 0 TeXcolorgray 606
+4532 a
+SDict begin H.S end
+ 606 4532 a 0 TeXcolorgray 0 TeXcolorgray 606 4532
 a
-SDict begin H.S end
- 1004 4464 a 0 1 0 TeXcolorrgb FA(7)p 0 1 0 TeXcolorrgb
-1045 4411 a
 SDict begin H.R end
- 1045 4411 a 1045 4464 a
-SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
-(cite.cfs:sosp01) cvn H.B /ANN pdfmark end
- 1045 4464 a Black
-FA(,)p 0 1 0 TeXcolorrgb 1068 4464 a
-SDict begin H.S end
- 1068 4464 a 0 1 0
-TeXcolorrgb FA(23)p 0 1 0 TeXcolorrgb 1152 4411 a
-SDict begin H.R end
- 1152
-4411 a 1152 4464 a
-SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
-(cite.rowstron01storage) cvn H.B /ANN pdfmark end
- 1152 4464 a Black FA(])g(route)g(con)n(ten)n(t)g
-(using)g(distributed)g(hash)g(tables)g([)p 0 1 0 TeXcolorrgb
-2805 4464 a
-SDict begin H.S end
- 2805 4464 a 0 1 0 TeXcolorrgb FA(16)p 0 1 0
-TeXcolorrgb 2889 4411 a
-SDict begin H.R end
- 2889 4411 a 2889 4464 a
-SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
-(cite.maymounkov02kademlia) cvn H.B /ANN pdfmark end
- 2889
-4464 a Black FA(,)p 0 1 0 TeXcolorrgb 2912 4464 a
-SDict begin H.S end
- 2912
-4464 a 0 1 0 TeXcolorrgb FA(25)p 0 1 0 TeXcolorrgb 2995
-4411 a
-SDict begin H.R end
- 2995 4411 a 2995 4464 a
-SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
-(cite.stoica01chord) cvn H.B /ANN pdfmark end
- 2995 4464 a Black FA(])g(to)g(ac)n(hiev)
-n(e)p Black 523 4538 473 4 v 546 4592 a Fy(1)p 0 TeXcolorgray
-606 4532 a
-SDict begin H.S end
- 606 4532 a 0 TeXcolorgray 0 TeXcolorgray 606
-4532 a
-SDict begin H.R end
  606 4532 a 606 4532 a
 SDict begin [ /View [/XYZ H.V] /Dest (Hfootnote.1) cvn H.B /DEST pdfmark
 end
- 606 4532 a Black 92 x Fx(Proto)r(col)i
-(description)e(from)g(the)g(giFT-F)-6 b(astT)g(rac)n(k)26
+ 606 4532 a Black 92 x Fx(Proto)r(col)28
+b(description)e(from)g(the)g(giFT-F)-6 b(astT)g(rac)n(k)26
 b(pro)t(ject)h(is)f(a)n(v)l(ailable)h(at)p 0 1 0 0 TeXcolorcmyk
 689 4802 a
 SDict begin H.S end
@@ -6298,144 +6262,183 @@
 end
  523 232 a Black 1036 w Fx(An)25
 b(Enco)r(ding)h(for)h(Censorship-Resistan)n(t)f(Sharing)238
-b(7)p Black 523 448 a Fq(O)r FA(\(log)15 b Fq(n)p FA(\))32
-b(scalabilit)n(y)-7 b(.)30 b(W)-7 b(ritable)32 b(distributed)g(\014le)f
-(systems)g(t)n(ypically)g(require)g(users)f(to)523 548
-y(authen)n(ticate)25 b(themselv)n(es)g(b)r(efore)f(b)r(eing)i(gran)n
-(ted)e(access)f(to)i(the)h(system)f(b)n(y)g(one)g(of)g(the)523
-648 y(serv)n(ers)c([)p 0 1 0 TeXcolorrgb 815 648 a
+b(7)p Black 523 448 a FA(systems)26 b(lik)n(e)g([)p 0 1 0
+TeXcolorrgb 1004 448 a
 SDict begin H.S end
- 815
-648 a 0 1 0 TeXcolorrgb FA(17)p 0 1 0 TeXcolorrgb 898
-594 a
+ 1004 448 a 0 1 0 TeXcolorrgb FA(7)p
+0 1 0 TeXcolorrgb 1045 395 a
 SDict begin H.R end
- 898 594 a 898 648 a
+ 1045 395 a 1045 448 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
+(cite.cfs:sosp01) cvn H.B /ANN pdfmark end
+ 1045
+448 a Black FA(,)p 0 1 0 TeXcolorrgb 1068 448 a
+SDict begin H.S end
+ 1068
+448 a 0 1 0 TeXcolorrgb FA(23)p 0 1 0 TeXcolorrgb 1152
+395 a
+SDict begin H.R end
+ 1152 395 a 1152 448 a
+SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
+(cite.rowstron01storage) cvn H.B /ANN pdfmark end
+ 1152 448 a Black FA(])g(route)g(con)n(ten)n
+(t)g(using)g(distributed)g(hash)g(tables)g([)p 0 1 0
+TeXcolorrgb 2805 448 a
+SDict begin H.S end
+ 2805 448 a 0 1 0 TeXcolorrgb FA(16)p
+0 1 0 TeXcolorrgb 2889 395 a
+SDict begin H.R end
+ 2889 395 a 2889 448 a
+SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
+(cite.maymounkov02kademlia) cvn H.B /ANN pdfmark end
+ 2889
+448 a Black FA(,)p 0 1 0 TeXcolorrgb 2912 448 a
+SDict begin H.S end
+ 2912
+448 a 0 1 0 TeXcolorrgb FA(25)p 0 1 0 TeXcolorrgb 2995
+395 a
+SDict begin H.R end
+ 2995 395 a 2995 448 a
+SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
+(cite.stoica01chord) cvn H.B /ANN pdfmark end
+ 2995 448 a Black FA(])g(to)g(ac)n(hiev)n(e)
+523 548 y Fq(O)r FA(\(log)15 b Fq(n)p FA(\))32 b(scalabilit)n(y)-7
+b(.)30 b(W)-7 b(ritable)32 b(distributed)g(\014le)f(systems)g(t)n
+(ypically)g(require)g(users)f(to)523 648 y(authen)n(ticate)25
+b(themselv)n(es)g(b)r(efore)f(b)r(eing)i(gran)n(ted)e(access)f(to)i
+(the)h(system)f(b)n(y)g(one)g(of)g(the)523 747 y(serv)n(ers)33
+b([)p 0 1 0 TeXcolorrgb 827 747 a
+SDict begin H.S end
+ 827 747 a 0 1 0 TeXcolorrgb
+FA(17)p 0 1 0 TeXcolorrgb 910 694 a
+SDict begin H.R end
+ 910 694 a 910 747
+a
+SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.mazires00sfs) cvn H.B /ANN pdfmark end
- 898 648 a Black FA(].)i(This)f(w)n(ork)g(fo)r
-(cuses)g(on)h(encrypting)f(shared)f(data)i(while)g(allo)n(wing)e(p)r
-(eers)h(to)523 747 y(v)n(erify)j(the)g(in)n(tegrit)n(y)f(of)i(the)f
-(encrypted)g(data)g(that)h(they)f(are)f(routing.)h(In)g([)p
-0 1 0 TeXcolorrgb 2961 747 a
+ 910 747 a Black FA(].)j(ECRS)e(fo)r(cuses)h(on)g(encrypting)g(shared)
+f(data)g(while)i(allo)n(wing)d(p)r(eers)i(to)523 847
+y(v)n(erify)21 b(the)h(in)n(tegrit)n(y)f(of)g(the)h(encrypted)g(data)f
+(that)h(they)g(are)f(routing.)g(In)h(SUNDR)h([)p 0 1 0
+TeXcolorrgb 3236 847 a
 SDict begin H.S end
- 2961 747 a 0 1 0 TeXcolorrgb
-FA(18)p 0 1 0 TeXcolorrgb 3045 694 a
+ 3236 847 a 0 1 0 TeXcolorrgb FA(18)p
+0 1 0 TeXcolorrgb 3319 793 a
 SDict begin H.R end
- 3045 694 a 3045
-747 a
+ 3319 793 a 3319 847 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.mazieres02building) cvn H.B /ANN pdfmark end
- 3045 747 a Black FA(])g(a)g(similar)523 847 y(problem)g(is)f
-(addressed;)g(here)h(users)f(can)g(detect)i(tamp)r(ering)e(b)n(y)h(the)
-g(\(un)n(trusted\))h(serv)n(er)523 946 y(that)h(is)f(storing)f(the)i
-(data)e(in)i(a)f(setting)g(where)g(m)n(ultiple)h(users)e(are)g(up)r
-(dating)i(the)g(same)523 1046 y(data.)f(This)g(w)n(ork)e(ac)n(hiev)n
-(es)h(what)h(is)g(called)f Ft(fork)30 b(c)l(onsistency)p
-FA(,)c(a)g(guaran)n(tee)e(that)i(if)h(the)523 1146 y(serv)n(er)h
-(passes)h(a)g(v)n(ersion)g(that)h(lac)n(ks)e(the)j(c)n(hanges)d(of)i
-(one)f(clien)n(t)h(to)g(another)f(clien)n(t)h(at)523
-1245 y(one)j(p)r(oin)n(t)g(in)g(time,)h(it)f(can)g(nev)n(er)f(again)g
-(mak)n(e)g(the)h(c)n(hanges)f(of)h(either)g(clien)n(t)g(visible)523
-1345 y(to)28 b(the)h(others.)f(This)g(is)g(a)g(w)n(eak)n(er)f(guaran)n
-(tee)f(than)j(the)g(optimal)f(situation)g(where)g(an)n(y)523
-1445 y(misb)r(eha)n(vior)20 b(is)h(detected,)h(ho)n(w)n(ev)n(er)e(it)h
+ 3319
+847 a Black FA(])e(a)523 946 y(similar)g(problem)h(is)g(addressed;)f
+(here)g(users)g(can)h(detect)h(tamp)r(ering)e(b)n(y)h(the)g(\(un)n
+(trusted\))523 1046 y(serv)n(er)g(that)i(is)g(storing)f(the)h(data)g
+(in)g(a)g(setting)f(where)h(m)n(ultiple)g(users)f(are)g(up)r(dating)i
+(the)523 1146 y(same)h(data.)g(SUNDR)h(ac)n(hiev)n(es)e(what)h(is)g
+(called)g Ft(fork)k(c)l(onsistency)p FA(,)d(a)e(guaran)n(tee)g(that)h
+(if)523 1245 y(the)h(serv)n(er)e(passes)h(a)h(v)n(ersion)e(that)i(lac)n
+(ks)f(the)h(c)n(hanges)f(of)h(one)f(clien)n(t)h(to)g(another)f(clien)n
+(t)523 1345 y(at)g(one)f(p)r(oin)n(t)h(in)h(time,)f(it)g(can)g(nev)n
+(er)f(again)g(mak)n(e)g(the)h(c)n(hanges)e(of)i(either)g(clien)n(t)g
+(visible)523 1445 y(to)i(the)h(others.)f(This)g(is)g(a)g(w)n(eak)n(er)f
+(guaran)n(tee)f(than)j(the)g(optimal)f(situation)g(where)g(an)n(y)523
+1544 y(misb)r(eha)n(vior)20 b(is)h(detected,)h(ho)n(w)n(ev)n(er)e(it)h
 (is)h(the)f(strongest)g(p)r(ossible)g(prop)r(ert)n(y)f(that)i(can)f(b)r
-(e)523 1544 y(ac)n(hiev)n(ed)h(giv)n(en)g(the)i(securit)n(y)e(mo)r(del)
+(e)523 1644 y(ac)n(hiev)n(ed)h(giv)n(en)g(the)i(securit)n(y)e(mo)r(del)
 i(used.)f(ECRS)g(do)r(es)g(not)g(allo)n(w)f(users)h(with)g(distinct)523
-1644 y(pseudon)n(yms)31 b(to)h(up)r(date)h(the)f(same)g(con)n(ten)n(t)f
+1743 y(pseudon)n(yms)31 b(to)h(up)r(date)h(the)f(same)g(con)n(ten)n(t)f
 (without)i(essen)n(tially)e(creating)g(t)n(w)n(o)g(\014les.)523
-1743 y(This)36 b(allo)n(ws)e(ECRS)i(to)g(guaran)n(tee)e(that)i(p)r
+1843 y(This)36 b(allo)n(ws)e(ECRS)i(to)g(guaran)n(tee)e(that)i(p)r
 (eers)g(can)f(nev)n(er)g(return)h(an)f Ft(invalid)j FA(result)523
-1843 y(since)27 b(ev)n(ery)g(cop)n(y)f(can)i(b)r(e)g(uniquely)f(iden)n
-(ti\014ed)h(at)g(all)f(times.)523 2012 y
+1943 y(since)27 b(ev)n(ery)g(cop)n(y)f(can)i(b)r(e)g(uniquely)f(iden)n
+(ti\014ed)h(at)g(all)f(times.)523 2112 y
 SDict begin H.S end
- 523 2012 a 523
-2012 a
+ 523 2112 a 523
+2112 a
 SDict begin 12 H.A end
- 523 2012 a 523 2012 a
+ 523 2112 a 523 2112 a
 SDict begin [ /View [/XYZ H.V] /Dest (section.1.3) cvn H.B /DEST pdfmark
 end
- 523 2012 a 101 x Fu(3)112
-b(ECRS)37 b(enco)s(ding)523 2316 y FA(The)30 b(primary)e(requiremen)n
+ 523 2112 a 101 x Fu(3)112
+b(ECRS)37 b(enco)s(ding)523 2416 y FA(The)30 b(primary)e(requiremen)n
 (ts)h(for)g(the)h(ECRS)f(enco)r(ding)g(are)g Ft(plausible)k
-(deniability)f FA(and)523 2415 y Ft(r)l(obustness)p FA(.)22
+(deniability)f FA(and)523 2516 y Ft(r)l(obustness)p FA(.)22
 b(Plausible)f(deniabilit)n(y)h(describ)r(es)g(the)g(abilit)n(y)g(of)g
-(the)h(participan)n(ts)e(to)h(claim)523 2515 y(ignorance)k(of)i(the)g
+(the)h(participan)n(ts)e(to)h(claim)523 2615 y(ignorance)k(of)i(the)g
 (nature)f(of)h(transferred)e(con)n(ten)n(t.)h(The)h(idea)f(here)h(is)f
-(that)h(b)n(y)g(making)523 2615 y(it)g(hard)f(for)g(in)n(termediaries)g
+(that)h(b)n(y)g(making)523 2715 y(it)g(hard)f(for)g(in)n(termediaries)g
 (to)g(determine)h(the)g(con)n(ten)n(ts)f(that)h(they)g(are)f(routing,)g
-(they)523 2714 y(are)h(less)h(lik)n(ely)f(to)i(casually)d(infringe)i
+(they)523 2814 y(are)h(less)h(lik)n(ely)f(to)i(casually)d(infringe)i
 (on)g(the)h(priv)-5 b(acy)28 b(of)h(other)g(users,)f(to)h(b)r(e)h
-(forced)e(to)523 2814 y(do)c(so)g(b)n(y)g(an)h(adv)n(ersary)c(and)k
+(forced)e(to)523 2914 y(do)c(so)g(b)n(y)g(an)h(adv)n(ersary)c(and)k
 (\014nally)f(to)g(b)r(e)h(held)g(resp)r(onsible)f(for)g(the)h(actions)e
-(of)i(others)523 2914 y(that)34 b(they)g(w)n(ere)e(un)n(wittingly)i
-(facilitating.)p 1 0 0 TeXcolorrgb 1961 2914 a
+(of)i(others)523 3014 y(that)34 b(they)g(w)n(ere)e(un)n(wittingly)i
+(facilitating.)p 1 0 0 TeXcolorrgb 1961 3014 a
 SDict begin H.S end
- 1961 2914
-a -31 x Fz(2)1998 2914 y
+ 1961 3014
+a -30 x Fz(2)1998 3014 y
 SDict begin 12 H.L end
- 1998 2914 a 1998 2914 a
+ 1998 3014 a 1998 3014 a
 SDict begin [ /Subtype /Link /Dest (Hfootnote.2) cvn /H /I /Border
 [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end
  1998
-2914 a Black 34 w FA(Robustness)f(is)h(the)g(enco)r(ding)f(abilit)n(y)g
-(to)523 3013 y(resist)i(attac)n(ks)f(suc)n(h)h(as)f(data)h(corruption)f
+3014 a Black 34 w FA(Robustness)f(is)h(the)g(enco)r(ding)f(abilit)n(y)g
+(to)523 3113 y(resist)i(attac)n(ks)f(suc)n(h)h(as)f(data)h(corruption)f
 (and)h(spam.)g(Spam)g(is)g(di\013eren)n(t)h(from)e(data)523
-3113 y(corruption)29 b(in)h(that)h(the)f(goal)f(of)h(the)g(spammer)g
+3213 y(corruption)29 b(in)h(that)h(the)f(goal)f(of)h(the)g(spammer)g
 (is)g(to)g(direct)g(the)g(user)g(to)g(undesirable)523
-3212 y(con)n(ten)n(t,)d(p)r(ossibly)h(hiding)f(useful)i(information)e
+3313 y(con)n(ten)n(t,)d(p)r(ossibly)h(hiding)f(useful)i(information)e
 (in)h(a)f(sea)g(of)h(useless)f(results.)g(Naturally)523
-3312 y(the)h(enco)r(ding)e(should)h(not)g(signi\014can)n(tly)g
+3412 y(the)h(enco)r(ding)e(should)h(not)g(signi\014can)n(tly)g
 (increase)f(the)h(amoun)n(t)g(of)g(data)g(that)g(needs)g(to)523
-3412 y(b)r(e)h(transferred.)648 3512 y(The)34 b(ECRS)g(enco)r(ding)g
+3512 y(b)r(e)h(transferred.)648 3612 y(The)34 b(ECRS)g(enco)r(ding)g
 (sc)n(heme)g(addresses)f(these)i(requiremen)n(ts.)e(ECRS)h(pro)n(vides)
-523 3612 y(plausible)40 b(deniabilit)n(y)f(b)n(y)h(hiding)g(the)g
+523 3712 y(plausible)40 b(deniabilit)n(y)f(b)n(y)h(hiding)g(the)g
 (nature)f(of)h(the)g(queries)f(and)h(resp)r(onses)e(from)523
-3711 y(in)n(termediaries)26 b(through)h(encryption.)648
-3812 y(Despite)c(the)g(fact)g(that)g(queries)f(and)h(resp)r(onses)e
-(are)h(encrypted,)h(in)n(termediaries)e(can)523 3911
-y Ft(verify)29 b FA(that)f(the)g(resp)r(onses)e(are)g(v)-5
-b(alid)28 b(with)g(resp)r(ect)f(to)g(a)g(particular)g(query)-7
-b(.)26 b(Th)n(us,)i(the)523 4011 y(enco)r(ding)38 b(mec)n(hanism)f(pro)
-n(vides)f(robustness)h(against)g(tamp)r(ering)g(and)h(false)g(replies.)
-523 4111 y(Additional)26 b(robustness)f(is)h(gained)f(in)h(ECRS)g(b)n
-(y)f(splitting)h(\014les)g(in)n(to)g(small)f(pieces)h(that)523
-4210 y(can)33 b(b)r(e)h Ft(indep)l(endently)g FA(v)n(eri\014ed,)f
-(stored)f(and)h(distributed)h(across)d(the)j(net)n(w)n(ork.)e(This)523
-4310 y(mak)n(es)e(it)h(easy)e(for)h(proto)r(cols)f(using)i(ECRS)f(to)g
-(incorp)r(orate)f(features)h(suc)n(h)g(as)g(sw)n(arm)p
-Black 523 4382 473 4 v 546 4436 a Fy(2)p 0 TeXcolorgray
-606 4376 a
+3812 y(in)n(termediaries)29 b(through)h(encryption.)g(Despite)h(the)g
+(fact)g(that)f(queries)g(and)g(resp)r(onses)523 3911
+y(are)21 b(encrypted,)h(in)n(termediaries)e(can)i Ft(verify)i
+FA(that)e(the)g(resp)r(onses)f(are)g(v)-5 b(alid)22 b(with)g(resp)r
+(ect)523 4011 y(to)f(a)g(particular)e(query)-7 b(.)21
+b(Th)n(us,)g(the)g(enco)r(ding)g(mec)n(hanism)g(pro)n(vides)e
+(robustness)h(against)523 4110 y(tamp)r(ering)g(and)g(false)h(replies.)
+e(Additional)i(robustness)e(is)i(gained)f(in)g(ECRS)g(b)n(y)h
+(splitting)523 4210 y(\014les)j(in)n(to)g(blo)r(c)n(ks)f(that)i(can)f
+(b)r(e)g Ft(indep)l(endently)i FA(v)n(eri\014ed,)d(stored)g(and)h
+(distributed)h(across)523 4310 y(the)c(net)n(w)n(ork.)e(This)h(mak)n
+(es)g(it)h(easy)e(for)h(proto)r(cols)f(using)h(ECRS)g(to)h(incorp)r
+(orate)e(features)p Black 523 4382 473 4 v 546 4436 a
+Fy(2)p 0 TeXcolorgray 606 4376 a
 SDict begin H.S end
- 606 4376 a 0 TeXcolorgray 0 TeXcolorgray 606
-4376 a
+ 606 4376 a 0 TeXcolorgray
+0 TeXcolorgray 606 4376 a
 SDict begin H.R end
  606 4376 a 606 4376 a
 SDict begin [ /View [/XYZ H.V] /Dest (Hfootnote.2) cvn H.B /DEST pdfmark
 end
- 606 4376 a Black 92 x Fx(If)19
-b(the)g(data)g(cannot)g(b)r(e)f(iden)n(ti\014ed,)h(editorial)h(con)n
-(trol)g(is)f(tec)n(hnically)g(imp)r(ossible.)i(In)d Fp(Str)l(atton)606
-4559 y(Oakmont)36 b(v.)g(Pr)l(o)l(digy)p Fx(,)g(an)e(In)n(ternet)f(pro)
-n(vider)h(w)n(as)i(found)e(liable)i(for)f(hosting)g(a)g(bulletin)606
-4650 y(b)r(oard)29 b(on)h(whic)n(h)f(o\013ensiv)n(e)g(messages)i(had)e
-(b)r(een)g(p)r(osted.)h(This)g(\014nding)e(resulted)h(b)r(ecause)606
-4742 y(the)g(pro)n(vider)g(had)g(hired)g(individuals)h(to)f(exercise)i
-(editorial)f(con)n(trol)g(o)n(v)n(er)g(con)n(ten)n(t.)f(If)g(the)606
-4833 y(pro)n(vider)17 b(had)g(merely)h(published)f(messages)j(from)e
-(users)g(without)g(in)n(terference,)g(the)f(pro)n(vider)606
-4924 y(w)n(ould)26 b(p)r(oten)n(tially)g(not)g(ha)n(v)n(e)f(b)r(een)g
-(held)h(accoun)n(table)g([)p 0 1 0 TeXcolorrgb 2319 4924
+ 606 4376
+a Black 92 x Fx(If)g(the)g(data)g(cannot)g(b)r(e)f(iden)n(ti\014ed,)h
+(editorial)h(con)n(trol)g(is)f(tec)n(hnically)g(imp)r(ossible.)i(In)d
+Fp(Str)l(atton)606 4559 y(Oakmont)36 b(v.)g(Pr)l(o)l(digy)p
+Fx(,)g(an)e(In)n(ternet)f(pro)n(vider)h(w)n(as)i(found)e(liable)i(for)f
+(hosting)g(a)g(bulletin)606 4650 y(b)r(oard)29 b(on)h(whic)n(h)f
+(o\013ensiv)n(e)g(messages)i(had)e(b)r(een)g(p)r(osted.)h(This)g
+(\014nding)e(resulted)h(b)r(ecause)606 4742 y(the)g(pro)n(vider)g(had)g
+(hired)g(individuals)h(to)f(exercise)i(editorial)f(con)n(trol)g(o)n(v)n
+(er)g(con)n(ten)n(t.)f(If)g(the)606 4833 y(pro)n(vider)17
+b(had)g(merely)h(published)f(messages)j(from)e(users)g(without)g(in)n
+(terference,)g(the)f(pro)n(vider)606 4924 y(w)n(ould)26
+b(p)r(oten)n(tially)g(not)g(ha)n(v)n(e)f(b)r(een)g(held)h(accoun)n
+(table)g([)p 0 1 0 TeXcolorrgb 2319 4924 a
+SDict begin H.S end
+ 2319 4924
+a 0 1 0 TeXcolorrgb Fx(26)p 0 1 0 TeXcolorrgb 2396 4876
 a
-SDict begin H.S end
- 2319 4924 a 0 1 0 TeXcolorrgb Fx(26)p 0 1 0 TeXcolorrgb
-2396 4876 a
 SDict begin H.R end
  2396 4876 a 2396 4924 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.stratton_oakmont) cvn H.B /ANN pdfmark end
- 2396 4924 a Black
-Fx(].)p Black Black Black eop end
+ 2396 4924 a Black Fx(].)p Black
+Black Black eop end
 %%Page: 8 8
 TeXDict begin 8 7 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop
@@ -6505,36 +6508,36 @@
 FA(s)g(and)523 1400 y Fq(I)7 b(B)t(l)r(ock)s FA(s)41
 b(are)f(CHK)i(enco)r(ded\))f(with)h(one)g Fq(K)6 b(B)t(l)r(ock)43
 b FA(to)e(allo)n(w)g(for)g(a)g(k)n(eyw)n(ord-based)523
-1500 y(searc)n(h.)p Black Black Black 523 1957 a(distribution)e([)p
-0 1 0 TeXcolorrgb 1010 1957 a
+1500 y(searc)n(h.)p Black Black Black 523 1957 a(suc)n(h)27
+b(as)f(sw)n(arm)g(distribution)h([)p 0 1 0 TeXcolorrgb
+1547 1957 a
 SDict begin H.S end
- 1010 1957 a 0 1 0 TeXcolorrgb
-FA(13)p 0 1 0 TeXcolorrgb 1093 1904 a
+ 1547 1957 a 0 1 0 TeXcolorrgb FA(13)p 0 1 0
+TeXcolorrgb 1630 1904 a
 SDict begin H.R end
- 1093 1904 a 1093
-1957 a
+ 1630 1904 a 1630 1957 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.hartman99swarm) cvn H.B /ANN pdfmark end
- 1093 1957 a Black FA(],)h(\014ne-grained)d(load)i(balancing)f
-(and)h(micro)r(economics)e([)p 0 1 0 TeXcolorrgb 3024
-1957 a
+ 1630
+1957 a Black FA(],)g(load)f(balancing)g(and)h(micro)r(economics)e([)p
+0 1 0 TeXcolorrgb 3036 1957 a
 SDict begin H.S end
- 3024 1957 a 0 1 0 TeXcolorrgb FA(11)p 0 1 0 TeXcolorrgb
-3107 1904 a
+ 3036 1957 a 0 1 0 TeXcolorrgb
+FA(11)p 0 1 0 TeXcolorrgb 3119 1904 a
 SDict begin H.R end
- 3107 1904 a 3107 1957 a
+ 3119 1904 a 3119
+1957 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.ebe2003) cvn H.B /ANN pdfmark end
- 3107 1957 a Black
-FA(].)i(These)523 2057 y(features)27 b(are)g(also)g(signi\014can)n(t)g
-(from)h(the)g(viewp)r(oin)n(t)g(of)g(scalabilit)n(y)-7
-b(.)27 b(When)h(all)g(handled)523 2157 y(blo)r(c)n(ks)d(are)g(small,)h
-(no)r(des)g(can)f(participate)g(in)i(the)f(net)n(w)n(ork)e(activit)n(y)
-i(ev)n(en)f(if)i(their)f(o)n(wn)523 2256 y(resources)36
-b(are)h(limited.)i(Also,)f(storing)f(small,)h(individually)g(unin)n
-(telligible)g(pieces)g(of)523 2356 y(p)r(oten)n(tially)19
-b(ob)5 b(jectionable)18 b(con)n(ten)n(t)h(is)g(lik)n(ely)f(to)h
-(further)g(supp)r(ort)g(plausible)g(deniabilit)n(y)-7
+ 3119 1957 a Black FA(].)i(These)523 2057 y(features)g(are)g
+(also)g(signi\014can)n(t)g(from)h(the)g(viewp)r(oin)n(t)g(of)g
+(scalabilit)n(y)-7 b(.)27 b(When)h(all)g(handled)523
+2157 y(blo)r(c)n(ks)d(are)g(small,)h(no)r(des)g(can)f(participate)g(in)
+i(the)f(net)n(w)n(ork)e(activit)n(y)i(ev)n(en)f(if)i(their)f(o)n(wn)523
+2256 y(resources)36 b(are)h(limited.)i(Also,)f(storing)f(small,)h
+(individually)g(unin)n(telligible)g(pieces)g(of)523 2356
+y(p)r(oten)n(tially)19 b(ob)5 b(jectionable)18 b(con)n(ten)n(t)h(is)g
+(lik)n(ely)f(to)h(further)g(supp)r(ort)g(plausible)g(deniabilit)n(y)-7
 b(.)648 2461 y(The)23 b(rest)g(of)h(this)g(Section)f(giv)n(es)g(a)g(b)r
 (ottom-up)h(description)f(of)g(ECRS.)h(After)g(a)f(brief)523
 2561 y(o)n(v)n(erview,)29 b(P)n(art)p 1 0 0 TeXcolorrgb
@@ -6587,74 +6590,74 @@
 (text\))h(query)e(or)g(the)h(corresp)r(onding)e(con)n(ten)n(t)523
 3059 y(and)39 b(ho)n(w)g(in)n(termediaries)f(can)h(v)n(erify)f(that)i
 (a)f(giv)n(en)f(encrypted)h(reply)g(matc)n(hes)g(the)523
-3158 y(encrypted)e(query)-7 b(.)36 b(Finally)-7 b(,)37
-b(the)h(core)e(of)h(ECRS)g(is)f(summarized)h(in)g(the)h(form)e(of)h(an)
-523 3258 y(algorithm)26 b(and)i(a)f(proto)r(col)f(example.)523
-3446 y
+3158 y(encrypted)c(query)-7 b(.)34 b(Finally)-7 b(,)35
+b(the)g(core)f(of)h(ECRS)g(is)f(summarized)h(in)g(the)g(form)g(of)g
+(the)523 3258 y(enco)r(ding)27 b(algorithm)g(and)g(a)g(proto)r(col)g
+(example.)523 3446 y
 SDict begin H.S end
  523 3446 a 523 3446 a
 SDict begin 12 H.A end
- 523 3446 a 523 3446 a
+ 523 3446 a
+523 3446 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.3.1) cvn H.B /DEST
 pdfmark end
- 523
-3446 a 89 x Fr(3.1)95 b(Ov)m(erview)523 3729 y FA(In)37
-b(ECRS,)g(the)g(enco)r(ded)f(represen)n(tation)f(of)i(a)g(\014le)f(is)h
-(a)f(collection)h(of)f(small)h(blo)r(c)n(ks.)523 3828
-y(There)j(are)f(four)h(t)n(yp)r(es)g(of)g(blo)r(c)n(ks:)g
-Ft(DBlo)l(cks)p FA(,)h Ft(IBlo)l(cks)p FA(,)g Ft(SBlo)l(cks)h
-FA(and)e Ft(KBlo)l(cks)p FA(.)h(The)523 3928 y(maxim)n(um)e(size)f(of)h
-(all)g(blo)r(c)n(ks)f(in)h(ECRS)f(is)h(supp)r(osed)g(to)f(b)r(e)i
-(\014xed)f(b)n(y)f(some)g(small)523 4028 y(n)n(um)n(b)r(er,)29
-b(for)h(example)f(32k.)f(The)i(blo)r(c)n(ks)f(are)g(used)g(to)h(create)
-e(a)i(tree)f(structure)g(of)h(the)523 4127 y(enco)r(ded)35
-b(\014le)h(\(see)g(Figure)p 1 0 0 TeXcolorrgb 1437 4127
+ 523 3446 a 89 x Fr(3.1)95 b(Ov)m(erview)523
+3729 y FA(In)35 b(ECRS,)g(the)g(enco)r(ded)g(represen)n(tation)f(of)h
+(a)f(\014le)h(is)g(a)g(collection)f(of)h(blo)r(c)n(ks.)g(There)523
+3828 y(are)26 b(four)g(t)n(yp)r(es)h(of)g(blo)r(c)n(ks:)f
+Ft(DBlo)l(cks)p FA(,)i Ft(IBlo)l(cks)p FA(,)g Ft(SBlo)l(cks)g
+FA(and)e Ft(KBlo)l(cks)p FA(.)i(The)f(maxim)n(um)523
+3928 y(size)33 b(of)h(all)g(blo)r(c)n(ks)f(in)h(ECRS)f(is)h(supp)r
+(osed)f(to)h(b)r(e)g(\014xed)g(b)n(y)f(some)h(small)f(n)n(um)n(b)r(er,)
+h(for)523 4028 y(example)29 b(32k.)g(The)g(blo)r(c)n(ks)g(are)f(used)i
+(to)f(create)g(a)g(tree)g(structure)g(of)h(the)f(enco)r(ded)h(\014le)
+523 4127 y(\(see)h(Figure)p 1 0 0 TeXcolorrgb 958 4127
 a
 SDict begin H.S end
- 1437 4127 a 1 0 0 TeXcolorrgb FA(1)p 1 0 0 TeXcolorrgb
-1479 4074 a
+ 958 4127 a 1 0 0 TeXcolorrgb FA(1)p 1 0 0 TeXcolorrgb
+1000 4074 a
 SDict begin H.R end
- 1479 4074 a 1479 4127 a
+ 1000 4074 a 1000 4127 a
 SDict begin [ /Color [1 0 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (figure.1.1) cvn H.B /ANN pdfmark end
- 1479 4127 a Black
-FA(\).)g(The)f(actual)g(\014le)h(data)f(is)g(enco)r(ded)h(in)g
-Ft(DBlo)l(cks)g FA(whic)n(h)523 4227 y(are)j(organized)g(b)n(y)h(a)g
-(tree)f(of)i Ft(IBlo)l(cks)p FA(.)g(The)g Ft(IBlo)l(cks)p
-FA(,)g(whic)n(h)f(are)g(similar)f(to)h(UNIX)523 4327
-y(ino)r(des)32 b([)p 0 1 0 TeXcolorrgb 807 4327 a
+ 1000 4127 a Black
+FA(\).)g(The)g(actual)g(\014le)g(data)g(is)g(enco)r(ded)g(in)g
+Ft(DBlo)l(cks)h FA(whic)n(h)f(are)f(organized)523 4227
+y(b)n(y)35 b(a)f(tree)h(of)f Ft(IBlo)l(cks)p FA(.)j(The)e
+Ft(IBlo)l(cks)p FA(,)h(whic)n(h)f(are)f(similar)g(to)g(UNIX)i(ino)r
+(des)f([)p 0 1 0 TeXcolorrgb 3130 4227 a
 SDict begin H.S end
- 807
-4327 a 0 1 0 TeXcolorrgb FA(19)p 0 1 0 TeXcolorrgb 890
-4273 a
+ 3130 4227 a
+0 1 0 TeXcolorrgb FA(19)p 0 1 0 TeXcolorrgb 3213 4173
+a
 SDict begin H.R end
- 890 4273 a 890 4327 a
+ 3213 4173 a 3213 4227 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.mckusick84fast) cvn H.B /ANN pdfmark end
- 890 4327 a Black FA(],)g(are)f
-(indirection-blo)r(c)n(ks)g(whic)n(h)g(enco)r(de)h(ho)n(w)g(the)g
-(leaf-no)r(des)f(of)h(the)g(tree)523 4426 y(can)22 b(b)r(e)h(reassem)n
-(bled)e(in)n(to)h(the)h(original)d(\014le.)j(Ev)n(ery)e
-Ft(IBlo)l(ck)i FA(pro)n(vides)e(the)i(data)f(required)523
-4526 y(to)29 b(request,)g(decrypt)g(and)g(v)n(erify)f(the)i(con)n(ten)n
-(ts)e(of)h(its)h(direct)f(c)n(hildren.)g(V)-7 b(eri\014cation)28
-b(is)523 4625 y(done)38 b(using)f(hash)h(co)r(des)f(of)h(the)g(c)n
+ 3213 4227 a Black FA(],)g(are)523
+4327 y(indirection-blo)r(c)n(ks)28 b(whic)n(h)h(enco)r(de)h(ho)n(w)e
+(the)i(leaf-no)r(des)f(of)g(the)h(tree)f(can)g(b)r(e)h(reassem-)523
+4426 y(bled)k(in)n(to)f(the)h(original)d(\014le.)j(Ev)n(ery)e
+Ft(IBlo)l(ck)i FA(pro)n(vides)e(the)i(data)f(required)f(to)i(request,)
+523 4526 y(decrypt)29 b(and)g(v)n(erify)f(the)h(con)n(ten)n(ts)g(of)g
+(its)g(direct)g(c)n(hildren.)f(V)-7 b(eri\014cation)29
+b(is)g(done)f(using)523 4625 y(hash)k(co)r(des)f(of)h(the)g(c)n
 (hildren,)g(similar)f(to)h(the)g(w)n(a)n(y)e(a)i(Merkle)f(tree)h([)p
-0 1 0 TeXcolorrgb 3299 4625 a
+0 1 0 TeXcolorrgb 2791 4625 a
 SDict begin H.S end
- 3299 4625 a 0 1 0 TeXcolorrgb
-FA(20)p 0 1 0 TeXcolorrgb 3382 4572 a
+ 2791 4625 a 0 1 0 TeXcolorrgb
+FA(20)p 0 1 0 TeXcolorrgb 2874 4572 a
 SDict begin H.R end
- 3382 4572 a 3382
+ 2874 4572 a 2874
 4625 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.merkle89tree) cvn H.B /ANN pdfmark end
- 3382 4625 a Black FA(])523 4725 y(w)n(orks.)27
-b(Giv)n(en)i(the)g(size)f(of)h(the)g(\014le,)g(the)g(top)g
-Ft(IBlo)l(ck)h FA(uniquely)f(iden)n(ti\014es)g(the)g(con)n(ten)n(ts)523
-4825 y(of)h(the)g(en)n(tire)f(\014le.)h Ft(KBlo)l(cks)g
-FA(and)g Ft(SBlo)l(cks)g FA(facilitate)g(obtaining)f(the)h(k)n(ey)f
-(\(to)h(decrypt\))523 4924 y(and)d(query)g(\(to)h(request\))f(for)g
+ 2874 4625 a Black FA(])g(w)n(orks.)e(Giv)n(en)523
+4725 y(the)h(size)g(of)f(the)h(\014le,)g(the)g(top)g
+Ft(IBlo)l(ck)h FA(uniquely)f(iden)n(ti\014es)g(the)g(con)n(ten)n(ts)f
+(of)g(the)h(en)n(tire)523 4825 y(\014le.)25 b Ft(KBlo)l(cks)h
+FA(and)f Ft(SBlo)l(cks)h FA(facilitate)f(obtaining)g(the)g(k)n(ey)f
+(\(to)i(decrypt\))f(and)g(query)f(\(to)523 4924 y(request\))j(for)g
 (the)h(top)g Ft(IBlo)l(ck)p FA(.)p Black Black eop end
 %%Page: 9 9
 TeXDict begin 9 8 bop 0 0 a
@@ -6684,33 +6687,34 @@
  523 365 a 83 x Fr(3.2)95 b Fi(DBlo)-5 b(cks)523
 632 y FA(Ev)n(ery)38 b Ft(DBlo)l(ck)j FA(corresp)r(onds)d(to)h(32k)g
 (of)h(the)g(original)e(\014le)i(\(the)h(last)e(blo)r(c)n(k)h(ma)n(y)f
-(b)r(e)523 732 y(padded)31 b(with)h(zeros\).)f Ft(DBlo)l(ck)p
-FA(s)h(are)e(encrypted)h(using)g(a)g(symmetric)g(cipher.)g(The)h(k)n
-(ey)523 831 y(for)26 b(the)i(cipher)e(for)h(the)g Ft(DBlo)l(ck)h
-FA(corresp)r(onding)d(to)i(the)g(plain)n(text)g Fq(B)2782
-843 y Fh(i)2836 831 y FA(is)g Fq(K)2990 843 y Fh(i)3040
-831 y FA(:=)c Fq(H)7 b FA(\()p Fq(B)3322 843 y Fh(i)3350
-831 y FA(\).)523 931 y(This)36 b(guaran)n(tees)d(that)j(the)g(same)f
-(blo)r(c)n(k)g(will)h(alw)n(a)n(ys)d(b)r(e)j(encrypted)g(with)g(the)g
-(same)523 1031 y(k)n(ey)-7 b(.)29 b(Also,)h(the)g(in)n(tegrit)n(y)f(of)
-g(the)h(decrypted)g(blo)r(c)n(k)f(can)h(b)r(e)g(v)n(eri\014ed)f(b)n(y)g
-(c)n(hec)n(king)g(that)523 1130 y Fq(K)594 1142 y Fh(i)644
-1130 y FA(=)23 b Fq(H)7 b FA(\()p Fq(B)903 1142 y Fh(i)931
-1130 y FA(\).)21 b(The)f(encrypted)h(blo)r(c)n(k)f Fq(E)1822
-1142 y Fh(K)1878 1150 y Fg(i)1909 1130 y FA(\()p Fq(B)2004
-1142 y Fh(i)2032 1130 y FA(\))h(can)f(b)r(e)h(uniquely)g(iden)n
-(ti\014ed)g(b)n(y)g(its)f(hash)523 1230 y Fq(Q)589 1242
-y Fh(i)649 1230 y FA(:=)33 b Fq(H)7 b FA(\()p Fq(E)939
-1242 y Fh(K)995 1250 y Fg(i)1025 1230 y FA(\()p Fq(B)1120
-1242 y Fh(i)1148 1230 y FA(\)\).)34 b(A)g(p)r(eer)f(can)g(query)g(for)g
-Fq(E)2142 1242 y Fh(K)2198 1250 y Fg(i)2228 1230 y FA(\()p
-Fq(B)2323 1242 y Fh(i)2351 1230 y FA(\))h(using)f Fq(Q)2706
-1242 y Fh(i)2767 1230 y FA(without)h(rev)n(ealing)523
-1330 y Fq(K)594 1342 y Fh(i)621 1330 y FA(.)39 b(Consequen)n(tly)-7
-b(,)38 b(the)h(pair)f(\()p Fq(K)1664 1342 y Fh(i)1692
-1330 y Fq(;)14 b(Q)1795 1342 y Fh(i)1822 1330 y FA(\))39
-b(can)f(b)r(e)h(used)g(to)g(retriev)n(e)e(and)i(decrypt)f
-Fq(B)3354 1342 y Fh(i)3382 1330 y FA(.)523 1429 y(In)n(termediaries)28
+(b)r(e)523 732 y(padded)20 b(with)h(zeros\).)f Ft(DBlo)l(ck)p
+FA(s)h(are)f(encrypted)g(using)g(a)g(symmetric)g(cipher.)g(The)h(k)n
+(ey)f(for)523 831 y(the)29 b(cipher)f(for)h(the)g Ft(DBlo)l(ck)g
+FA(that)g(corresp)r(onds)e(to)i(the)g(plain)n(text)f
+Fq(B)2774 843 y Fh(i)2831 831 y FA(is)g Fq(K)2986 843
+y Fh(i)3038 831 y FA(:=)d Fq(H)7 b FA(\()p Fq(B)3322
+843 y Fh(i)3350 831 y FA(\).)523 931 y(This)36 b(guaran)n(tees)d(that)j
+(the)g(same)f(blo)r(c)n(k)g(will)h(alw)n(a)n(ys)d(b)r(e)j(encrypted)g
+(with)g(the)g(same)523 1031 y(k)n(ey)-7 b(.)29 b(Also,)h(the)g(in)n
+(tegrit)n(y)f(of)g(the)h(decrypted)g(blo)r(c)n(k)f(can)h(b)r(e)g(v)n
+(eri\014ed)f(b)n(y)g(c)n(hec)n(king)g(that)523 1130 y
+Fq(K)594 1142 y Fh(i)644 1130 y FA(=)23 b Fq(H)7 b FA(\()p
+Fq(B)903 1142 y Fh(i)931 1130 y FA(\).)21 b(The)f(encrypted)h(blo)r(c)n
+(k)f Fq(E)1822 1142 y Fh(K)1878 1150 y Fg(i)1909 1130
+y FA(\()p Fq(B)2004 1142 y Fh(i)2032 1130 y FA(\))h(can)f(b)r(e)h
+(uniquely)g(iden)n(ti\014ed)g(b)n(y)g(its)f(hash)523
+1230 y Fq(Q)589 1242 y Fh(i)649 1230 y FA(:=)33 b Fq(H)7
+b FA(\()p Fq(E)939 1242 y Fh(K)995 1250 y Fg(i)1025 1230
+y FA(\()p Fq(B)1120 1242 y Fh(i)1148 1230 y FA(\)\).)34
+b(A)g(p)r(eer)f(can)g(query)g(for)g Fq(E)2142 1242 y
+Fh(K)2198 1250 y Fg(i)2228 1230 y FA(\()p Fq(B)2323 1242
+y Fh(i)2351 1230 y FA(\))h(using)f Fq(Q)2706 1242 y Fh(i)2767
+1230 y FA(without)h(rev)n(ealing)523 1330 y Fq(K)594
+1342 y Fh(i)621 1330 y FA(.)39 b(Consequen)n(tly)-7 b(,)38
+b(the)h(pair)f(\()p Fq(K)1664 1342 y Fh(i)1692 1330 y
+Fq(;)14 b(Q)1795 1342 y Fh(i)1822 1330 y FA(\))39 b(can)f(b)r(e)h(used)
+g(to)g(retriev)n(e)e(and)i(decrypt)f Fq(B)3354 1342 y
+Fh(i)3382 1330 y FA(.)523 1429 y(In)n(termediaries)28
 b(can)g(v)n(erify)g(that)i(a)e(resp)r(onse)g Fq(E)2105
 1441 y Fh(K)2161 1449 y Fg(i)2192 1429 y FA(\()p Fq(B)2287
 1441 y Fh(i)2315 1429 y FA(\))h(matc)n(hes)f(a)h(query)f
@@ -6786,20 +6790,20 @@
 (termediaries)f(w)n(ould)h(learn)g(ab)r(out)g(the)g(CHK)h(k)n(eys)e
 (that)i(they)f(are)523 4227 y(storing)32 b(or)g(transmitting,)h(whic)n
 (h)g(ma)n(y)f(allo)n(w)g(them)h(to)g(easily)f(censor)g(searc)n(h)f
-(results.)523 4327 y(Second,)e(the)h(k)n(eyw)n(ords)d(are)i(exp)r(osed)
-g(to)g(the)h(in)n(termediaries,)e(whic)n(h)h(again)f(w)n(ould)h(fa-)523
-4426 y(cilitate)d(censorship.)e(Finally)-7 b(,)25 b(p)r(eers)g(w)n
-(ould)g(b)r(e)h(able)f(to)h(send)f(in)n(v)-5 b(alid)25
-b(replies)g(that)h(refer)523 4526 y(to)e(inappropriate)g(con)n(ten)n
-(t.)g(This)g(ma)n(y)g(b)r(e)h(just)g(a)f(n)n(uisance)g(if)h(malicious)f
-(p)r(eers)g(use)h(this)523 4625 y(for)j(adv)n(ertising)g(\(this)h(kind)
-g(of)g(b)r(eha)n(vior)f(can)g(b)r(e)i(observ)n(ed)d(on)i(gn)n(utella)f
-(from)h(time)g(to)523 4725 y(time\).)j(Ho)n(w)n(ev)n(er,)d(if)i(a)f
-(net)n(w)n(ork)g(w)n(an)n(ts)g(to)g(economically)g(rew)n(ard)f(p)r
-(eers)h(for)h(returning)523 4825 y(searc)n(h)g(results)h(the)h(p)r
-(ossibilit)n(y)f(of)h(returning)e(arbitrary)g(nonsense)h(w)n(ould)g
-(mak)n(e)f(suc)n(h)523 4924 y(incen)n(tiv)n(e)c(sc)n(hemes)g
-(impractical.)p Black Black eop end
+(results.)523 4327 y(Second,)36 b(the)g(k)n(eyw)n(ords)d(are)i
+(directly)h(exp)r(osed)f(to)h(the)g(in)n(termediaries,)e(whic)n(h)i
+(again)523 4426 y(w)n(ould)31 b(facilitate)f(censorship.)g(Finally)-7
+b(,)31 b(p)r(eers)g(w)n(ould)f(b)r(e)i(able)e(to)h(send)g(in)n(v)-5
+b(alid)31 b(replies)523 4526 y(that)37 b(refer)f(to)h(inappropriate)e
+(con)n(ten)n(t.)h(This)h(ma)n(y)f(b)r(e)h(just)g(a)g(n)n(uisance)f(if)h
+(malicious)523 4625 y(p)r(eers)26 b(use)g(this)h(for)f(adv)n(ertising)e
+(\(this)j(kind)g(of)f(b)r(eha)n(vior)f(can)h(b)r(e)h(observ)n(ed)e(on)h
+(gn)n(utella)523 4725 y(from)k(time)h(to)g(time\).)h(P)n(ossibly)c(w)n
+(orse,)i(if)h(a)f(net)n(w)n(ork)f(w)n(an)n(ts)h(to)g(economically)g
+(rew)n(ard)523 4825 y(p)r(eers)24 b(for)f(returning)h(searc)n(h)e
+(results,)i(the)g(p)r(ossibilit)n(y)g(of)g(returning)g(arbitrary)e
+(nonsense)523 4924 y(migh)n(t)28 b(mak)n(e)e(suc)n(h)i(incen)n(tiv)n(e)
+f(sc)n(hemes)g(impractical.)p Black Black eop end
 %%Page: 10 10
 TeXDict begin 10 9 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop
@@ -6829,19 +6833,19 @@
 (user)e(who)h(is)g(uploading)f(the)h(con)n(ten)n(t.)g(That)523
 946 y(user)32 b(m)n(ust)h(sp)r(ecify)h(appropriate)d(k)n(eyw)n(ords)f
 (and)j(metadata)g(that)g(prop)r(erly)f(describ)r(es)523
-1046 y(the)f(con)n(ten)n(t.)g(Clearly)e(this)i(trust)g(ma)n(yb)r(e)g
-(misplaced.)f(Namespaces)g(are)f(a)i(solution)f(to)523
-1146 y(this)d(problem)f(since)g(they)h(enable)f(users)g(to)g(learn)g
-(whic)n(h)g(other)g(users)g(are)g(trust)n(w)n(orth)n(y)-7
-b(.)523 1299 y
+1046 y(the)24 b(con)n(ten)n(t.)g(Clearly)f(this)h(trust)h(ma)n(yb)r(e)e
+(misplaced.)h(Namespaces)f(can)h(help)g(solv)n(e)f(this)523
+1146 y(problem)k(since)h(they)f(enable)h(users)e(to)i(learn)f(whic)n(h)
+g(other)g(users)g(are)f(trust)n(w)n(orth)n(y)-7 b(.)523
+1299 y
 SDict begin H.S end
  523 1299 a 523 1299 a
 SDict begin 12 H.A end
- 523 1299 a 523 1299
-a
+ 523 1299 a 523 1299 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.3.5) cvn H.B /DEST
 pdfmark end
- 523 1299 a 84 x Fr(3.5)95 b(Namespaces)523 1537 y FA(One)25
+ 523
+1299 a 84 x Fr(3.5)95 b(Namespaces)523 1537 y FA(One)25
 b(w)n(a)n(y)f(to)i(a)n(v)n(oid)d(searc)n(hing)h(in)i(an)f(un)n(trust)n
 (w)n(orth)n(y)f(global)g(k)n(eyw)n(ord)f(space)i(that)h(ma)n(y)523
 1637 y(con)n(tain)21 b(mostly)g(inappropriately)f(lab)r(eled)i(con)n
@@ -6949,7 +6953,7 @@
 (single)g(en)n(tit)n(y)-7 b(,)523 847 y(consistency)33
 b(issues)h(from)g(parallel)f(up)r(dates)h(do)g(not)h(arise.)e(ECRS)h
 (do)r(es)g(not)g(prev)n(en)n(t)523 946 y(the)28 b(o)n(wner)e(of)i(the)g
-(namespace)f(to)g(publish)h(con\015icting)f(up)r(dates.)648
+(namespace)f(from)g(publishing)g(con\015icting)h(up)r(dates.)648
 1046 y(It)22 b(should)h(b)r(e)g(recognized)e(that)i(the)g(same)f
 (\014le)g(can)h(b)r(e)g(part)f(of)g(m)n(ultiple)h(namespaces)523
 1146 y(under)k(m)n(ultiple)h(iden)n(ti\014ers)f(without)h(the)g(need)f
@@ -6957,26 +6961,26 @@
 1245 y(the)37 b(net)n(w)n(ork.)e(The)i Ft(IBlo)l(cks)h
 FA(and)e Ft(DBlo)l(cks)i FA(of)e(the)h(\014le)g(do)f(not)h(need)g(to)f
 (b)r(e)h(c)n(hanged)523 1345 y(when)28 b(the)g(namespace)e(or)h
-(namespace)g(iden)n(ti\014er)g(c)n(hanges.)648 1445 y(Ho)n(w)n(ev)n
-(er,)d(namespaces)h(cannot)g(completely)h(solv)n(e)f(the)i(searc)n(h)d
-(problem.)i(Most)g(im-)523 1544 y(p)r(ortan)n(tly)-7
-b(,)31 b(users)g(w)n(ould)h(still)g(ha)n(v)n(e)e(to)i(\014nd)g(the)g
-(namespaces)f(themselv)n(es,)g(and)h(while)523 1644 y(it)g(can)g(b)r(e)
-g(assumed)f(that)i(users)e(can)g(guess)g(k)n(eyw)n(ords,)f(they)i(are)f
-(unlik)n(ely)g(to)h(b)r(e)g(able)523 1743 y(to)d(guess)f(public)h(k)n
-(eys)f(for)h(a)f(namespace)g(searc)n(h.)g(ECRS)g(solv)n(es)g(this)h
-(problem)f(b)n(y)h(also)523 1843 y(o\013ering)g(a)g(pure)h(k)n(eyw)n
-(ord-based)d(searc)n(h)h(in)i(a)g Ft(glob)l(al)h FA(k)n(eyw)n(ord)d
-(space)h(where)h(an)n(y)f(user)523 1943 y(can)35 b(adv)n(ertise)g(con)n
-(ten)n(t.)g(Here,)g(the)h(disadv)-5 b(an)n(tage)34 b(is)i(clearly)f
-(that)h(it)g(is)f(p)r(ossible)h(for)523 2042 y(malicious)h(users)g(to)h
-(p)r(ollute)g(the)g(global)f(k)n(eyw)n(ord)f(space)h(with)h(adv)n
-(ertisemen)n(ts)e(and)523 2142 y(other)24 b(inappropriate)g(data.)g(Ho)
-n(w)n(ev)n(er,)f(it)i(is)g(assumed)g(that)g(in)g(that)g(case)f(users)g
-(will)h(use)523 2242 y(k)n(eyw)n(ords)j(that)j(are)e(more)h(di\016cult)
-h(to)f(guess)f(or)h(only)f(use)i(the)f(global)f(k)n(eyw)n(ord)g(space)
-523 2341 y(to)e(disco)n(v)n(er)e(trust)n(w)n(orth)n(y)h(namespaces)g({)
-h(th)n(us)g(a)n(v)n(oiding)e(the)j(spam)f(most)g(of)g(the)g(time.)523
+(namespace)g(iden)n(ti\014er)g(c)n(hanges.)648 1445 y(Namespaces)f
+(cannot)h(completely)h(solv)n(e)e(the)i(searc)n(h)f(problem.)g(Most)g
+(imp)r(ortan)n(tly)-7 b(,)523 1544 y(users)33 b(w)n(ould)g(still)h(ha)n
+(v)n(e)f(to)h(\014nd)g(the)g(namespaces)f(themselv)n(es,)g(and)h(while)
+g(it)g(can)g(b)r(e)523 1644 y(assumed)g(that)h(users)e(can)h(guess)g(k)
+n(eyw)n(ords,)e(they)j(are)e(unlik)n(ely)h(to)h(b)r(e)f(able)h(to)f
+(guess)523 1743 y(public)26 b(k)n(eys)e(for)h(a)g(namespace)f(searc)n
+(h.)g(ECRS)h(solv)n(es)f(this)h(problem)g(b)n(y)g(also)f(o\013ering)g
+(a)523 1843 y(pure)18 b(k)n(eyw)n(ord-based)e(searc)n(h)h(in)i(a)f
+Ft(glob)l(al)i FA(k)n(eyw)n(ord)c(space)i(where)g(an)n(y)f(user)h(can)g
+(adv)n(ertise)523 1943 y(con)n(ten)n(t.)k(Here,)f(the)h(disadv)-5
+b(an)n(tage)21 b(is)g(clearly)g(that)h(it)g(is)g(p)r(ossible)g(for)f
+(malicious)g(users)g(to)523 2042 y(p)r(ollute)33 b(the)g(global)e(k)n
+(eyw)n(ord)f(space)i(with)h(adv)n(ertisemen)n(ts)e(and)h(other)g
+(inappropriate)523 2142 y(data.)39 b(Ho)n(w)n(ev)n(er,)f(it)i(is)g
+(assumed)f(that)h(in)h(that)f(case)f(users)f(will)i(use)g(k)n(eyw)n
+(ords)e(that)523 2242 y(are)h(more)g(di\016cult)h(to)g(guess)e(or)h
+(only)h(use)f(the)h(global)f(k)n(eyw)n(ord)e(space)i(to)h(disco)n(v)n
+(er)523 2341 y(trust)n(w)n(orth)n(y)26 b(namespaces)g({)h(th)n(us)h(a)n
+(v)n(oiding)e(the)i(spam)f(most)h(of)f(the)h(time.)523
 2495 y
 SDict begin H.S end
  523 2495 a 523 2495 a
@@ -6986,53 +6990,53 @@
 pdfmark end
  523
 2495 a 83 x Fr(3.6)95 b(Keyw)m(ord)32 b(searc)m(h)523
-2733 y FA(This)23 b(section)f(describ)r(es)g(ho)n(w)g(the)i(CHK)e(k)n
-(eys)g(that)h(are)f(necessary)f(to)i(retriev)n(e)e(a)h(\014le)h(can)523
-2832 y(b)r(e)34 b(obtained)g(b)n(y)g(searc)n(hing)e(using)h(natural)h
-(language)e Ft(keywor)l(ds)j FA({)f(without)g(rev)n(eiling)523
-2932 y(the)20 b(k)n(eyw)n(ords)e(to)h(in)n(termediaries.)g(Searc)n
-(hing)f(requires)h(the)h(con)n(ten)n(t)f(pro)n(vider)f(to)i(supply)523
-3031 y(metadata)28 b(ab)r(out)g(the)g(\014le,)h(in)f(particular)f(a)h
-(list)g(of)g(k)n(eyw)n(ords.)e(It)j(is)f(assumed)f(that)i(the)523
-3131 y(user)39 b(searc)n(hing)f(for)h(data)g(is)h(able)f(to)h
-Ft(guess)f FA(at)h(least)f(one)g(of)h(these)f(k)n(eyw)n(ords.)f(The)523
-3231 y(nature)28 b(of)h(the)f(searc)n(h)f(implies)i(that)g(there)f(is)h
-(no)f(direct,)g(cryptographically)e(v)n(eri\014able)523
-3330 y(relation)35 b(b)r(et)n(w)n(een)h(the)h(k)n(eyw)n(ord)d(and)i
-(the)g(con)n(ten)n(t.)g(Man)n(y)g(\014les)g(can)f(matc)n(h)h(a)g(giv)n
-(en)523 3430 y(k)n(eyw)n(ord,)f(and)i(di\013eren)n(t)g(users)f(ma)n(y)g
-(ev)n(en)g(sometimes)h(ha)n(v)n(e)f(a)g(di\013eren)n(t)h(p)r(erception)
-523 3530 y(of)i(what)f(is)h(a)f(correct)f(seman)n(tic)h(matc)n(h.)h(Th)
-n(us)f(a)g(k)n(eyw)n(ord)f(searc)n(h)g(alw)n(a)n(ys)g(has)h(the)523
-3629 y(p)r(oten)n(tial)f(of)f(resulting)g(in)h(searc)n(h)e(results)h
-(that)h(a)g(user)f(ma)n(y)f(\014nd)j(inappropriate.)d(It)523
-3729 y(is)j(also)f(not)h(p)r(ossible)g(to)g(prev)n(en)n(t)f(a)g(user)h
-(from)f(supplying)h(k)n(eyw)n(ords)e(that)i(ha)n(v)n(e)f(no)523
-3828 y(seman)n(tic)c(relation)f(with)h(the)h(con)n(ten)n(t)e(and)h
-(thereb)n(y)f(increasing)g(the)h(c)n(hance)g(of)g(other)523
-3928 y(users)27 b(\014nding)g(undesirable)g(results)g(for)g(those)h(k)n
-(eyw)n(ords.)648 4028 y(Ho)n(w)n(ev)n(er,)21 b(ECRS)j(should)f(\(and)h
-(can\))f(giv)n(e)g(some)g(un)n(usual)g Ft(guar)l(ante)l(es)g
-FA(for)g(k)n(eyw)n(ord-)523 4127 y(based)29 b(searc)n(hes.)e(First,)j
-(the)f(k)n(eyw)n(ord)f(used)h(for)g(a)g(searc)n(h)f(is)h(not)g(exp)r
-(osed)g(to)h(in)n(terme-)523 4227 y(diaries)h(in)h(a)f(w)n(a)n(y)f
-(that)i(w)n(ould)f(allo)n(w)g(them)h(to)f(easily)g(exercise)g
-(editorial)f(con)n(trol)h(\(i.e.)523 4327 y(to)c(censor)g(queries\).)g
-(Again)g(a)g(guessing)f(attac)n(k,)h(where)g(the)h(in)n(termediary)e
-(guesses)h(the)523 4426 y(k)n(eyw)n(ord)e(and)i(can)g(then)g(compute)h
-(the)f(query)f(for)h(this)g(k)n(eyw)n(ord,)f(is)h(acceptable.)f(Plau-)
-523 4526 y(sible)g(deniabilit)n(y)f(for)g(the)h(in)n(termediaries)f(is)
-g(una\013ected)h(b)n(y)f(this)h(attac)n(k.)f(Second,)g(only)523
-4625 y(p)r(eers)36 b(that)i(ha)n(v)n(e)d(con)n(ten)n(t)i(a)n(v)-5
-b(ailable)35 b(under)i(the)g(giv)n(en)f(k)n(eyw)n(ord)f(should)h(b)r(e)
-i(able)e(to)523 4725 y(pro)r(duce)24 b(a)f(v)-5 b(alid)25
-b(resp)r(onse.)e(In)h(other)f(w)n(ords,)g(the)i(ultimate)f(resp)r
-(onder)f(m)n(ust)i(ha)n(v)n(e)d(suc-)523 4825 y(ceeded)30
-b(in)g(guessing)f(the)i(k)n(eyw)n(ord.)d(This)i(is)g(imp)r(ortan)n(t)f
-(since)h(it)h(prev)n(en)n(ts)e(p)r(eers)g(from)523 4924
-y(making)24 b(up)h(replies)f(for)g(arbitrary)f(requests)h(on-the-\015y)
--7 b(.)24 b(If)h(p)r(eers)f(w)n(ere)g(able)g(to)h(resp)r(ond)p
-Black Black eop end
+2733 y FA(This)24 b(section)f(describ)r(es)g(ho)n(w)h(information)f(ab)
+r(out)h(namespaces)e(or)h(the)h(CHK)g(k)n(eys)f(that)523
+2832 y(are)30 b(necessary)f(to)h(retriev)n(e)f(a)i(\014le)g(can)f(b)r
+(e)h(obtained)f(b)n(y)h(searc)n(hing)d(using)j(natural)f(lan-)523
+2932 y(guage)k Ft(keywor)l(ds)j FA({)f(without)g(rev)n(eiling)e(the)i
+(k)n(eyw)n(ords)e(to)h(in)n(termediaries.)f(Searc)n(hing)523
+3031 y(requires)27 b(the)i(con)n(ten)n(t)f(pro)n(vider)e(to)i(supply)h
+(metadata)e(ab)r(out)i(the)f(\014le,)h(in)f(particular)f(a)523
+3131 y(list)d(of)f(k)n(eyw)n(ords.)e(It)i(is)h(assumed)e(that)i(the)f
+(user)g(searc)n(hing)e(for)i(data)g(is)g(able)g(to)g
+Ft(guess)g FA(at)523 3231 y(least)h(one)g(of)g(these)h(k)n(eyw)n(ords.)
+d(The)i(nature)g(of)h(the)f(searc)n(h)f(implies)i(that)g(there)f(is)g
+(no)g(di-)523 3330 y(rect,)i(cryptographically)d(v)n(eri\014able)i
+(relation)g(b)r(et)n(w)n(een)h(the)h(k)n(eyw)n(ord)d(and)i(the)g(con)n
+(ten)n(t.)523 3430 y(Man)n(y)33 b(\014les)h(can)f(matc)n(h)h(a)f(giv)n
+(en)g(k)n(eyw)n(ord.)f(Di\013eren)n(t)i(users)f(ma)n(y)g(sometimes)g
+(ha)n(v)n(e)f(a)523 3530 y(di\013eren)n(t)25 b(p)r(erception)f(of)h
+(what)f(is)h(a)f(correct)f(seman)n(tic)h(matc)n(h.)g(Th)n(us)h(a)f(k)n
+(eyw)n(ord)f(searc)n(h)523 3629 y(alw)n(a)n(ys)h(has)g(the)i(p)r(oten)n
+(tial)g(of)f(resulting)g(in)h(searc)n(h)d(results)i(that)h(a)f(user)g
+(ma)n(y)g(\014nd)g(inap-)523 3729 y(propriate.)f(It)i(is)f(also)f(not)h
+(p)r(ossible)g(to)g(prev)n(en)n(t)f(a)h(user)g(from)g(supplying)g(k)n
+(eyw)n(ords)e(that)523 3828 y(ha)n(v)n(e)h(no)h(seman)n(tic)f(relation)
+g(with)i(the)g(con)n(ten)n(t)e(and)h(thereb)n(y)g(increasing)e(the)j(c)
+n(hance)e(of)523 3928 y(other)j(users)g(\014nding)g(undesirable)g
+(results)g(for)g(those)h(k)n(eyw)n(ords.)648 4028 y(Despite)38
+b(these)g(fundamen)n(tal)h(dra)n(wbac)n(ks,)c(ECRS)j(should)g(\(and)g
+(can\))g(giv)n(e)g(some)523 4127 y(un)n(usual)e Ft(guar)l(ante)l(es)f
+FA(for)h(k)n(eyw)n(ord-based)d(searc)n(hes.)h(First,)i(the)g(k)n(eyw)n
+(ord)e(used)i(for)f(a)523 4227 y(searc)n(h)23 b(is)i(not)f(exp)r(osed)h
+(to)f(in)n(termediaries)g(in)h(a)f(w)n(a)n(y)f(that)i(w)n(ould)f(allo)n
+(w)g(them)h(to)g(easily)523 4327 y(exercise)g(editorial)g(con)n(trol)f
+(\(i.e.)j(to)f(censor)e(queries\).)i(Again)f(a)h(guessing)e(attac)n(k,)
+i(where)523 4426 y(the)j(in)n(termediary)f(guesses)g(the)h(k)n(eyw)n
+(ord)e(and)i(can)g(then)g(compute)h(the)f(query)f(for)h(this)523
+4526 y(k)n(eyw)n(ord,)c(is)h(acceptable.)f(Plausible)h(deniabilit)n(y)g
+(for)g(the)g(in)n(termediaries)f(is)i(una\013ected)523
+4625 y(b)n(y)32 b(this)g(attac)n(k.)f(Second,)g(only)h(p)r(eers)f(that)
+h(ha)n(v)n(e)f(con)n(ten)n(t)g(a)n(v)-5 b(ailable)31
+b(under)h(the)g(giv)n(en)523 4725 y(k)n(eyw)n(ord)20
+b(should)i(b)r(e)g(able)g(to)g(pro)r(duce)f(a)h(v)-5
+b(alid)22 b(resp)r(onse.)f(In)h(other)f(w)n(ords,)g(the)i(ultimate)523
+4825 y(resp)r(onder)g(m)n(ust)h(ha)n(v)n(e)f(succeeded)g(in)i(guessing)
+d(the)j(k)n(eyw)n(ord.)d(This)i(is)g(imp)r(ortan)n(t)f(since)523
+4924 y(it)40 b(prev)n(en)n(ts)f(p)r(eers)h(from)f(making)g(up)i
+(replies)e(for)g(arbitrary)f(requests)h(on-the-\015y)-7
+b(.)40 b(If)p Black Black eop end
 %%Page: 12 12
 TeXDict begin 12 11 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop
@@ -7050,52 +7054,51 @@
 end
  523 232 a Black Fx(12)199 b(C.)27
 b(Grotho\013,)f(K.)g(Grotho\013,)g(T.)h(Horozo)n(v,)f(J.T.)h(Lindgren)p
-Black 523 448 a FA(to)g(an)n(y)g(k)n(eyw)n(ord)f(query)h(without)h(ha)n
-(ving)e(to)i(at)f(least)g(guess)g(the)h(k)n(eyw)n(ord,)d(they)j(could)
-523 548 y(use)38 b(this)h(to)f(spam)f(ev)n(ery)g(p)r(ossible)h(searc)n
-(h,)f(rendering)g(the)h(k)n(eyw)n(ord)f(searc)n(h)f(mostly)523
-648 y(useless.)e(F)-7 b(orcing)33 b(resp)r(onders)g(to)h(guess)f(k)n
-(eyw)n(ords)f(do)r(es)i(not)g(eliminate)h(the)g(problem)523
-747 y(completely)-7 b(.)23 b(Ho)n(w)n(ev)n(er,)e(it)j(do)r(es)f(limit)h
-(the)f(attac)n(k)f(to)h(the)h(common,)e(easily)h(guessed)f(k)n(ey-)523
-847 y(w)n(ords.)32 b(Finally)-7 b(,)34 b(the)g(v)n(eri\014cation)e
-(that)i(a)f(resp)r(onse)g(is)h(v)-5 b(alid)33 b(should)h(b)r(e)g(p)r
-(ossible)f(not)523 946 y(only)27 b(for)g(the)h(\014nal)g(recipien)n(t,)
-f(but)h(also)f(for)g(in)n(termediaries.)648 1055 y(ECRS)38
-b(ac)n(hiev)n(es)g(all)g(of)h(this)h(with)f(a)g Ft(new)h(crypto)l(gr)l
-(aphic)j(primitive)p FA(,)e(whic)n(h)e(is)f(a)523 1155
-y(public-priv)-5 b(ate)35 b(k)n(ey)g(pair)g(\()p Fq(P)1481
-1167 y Fh(pub)1588 1155 y FA(\()p Fq(K)6 b FA(\))p Fq(;)14
-b(P)1819 1167 y Fh(pr)r(iv)1949 1155 y FA(\()p Fq(K)6
-b FA(\)\))36 b(that)g(is)f(generated)g(from)g(a)g(k)n(eyw)n(ord)523
-1254 y Fq(K)6 b FA(.)34 b(The)g(k)n(eyw)n(ord)e Fq(K)40
-b FA(is)33 b(used)h(as)g(the)g(seed)g(and)g(only)g(input)g(to)g(the)h
-(pseudo-random)523 1354 y(n)n(um)n(b)r(er)30 b(generator)e(that)i(is)g
-(used)g(in)g(the)h(generation)d(of)i(the)h(public-priv)-5
+Black 523 448 a FA(p)r(eers)37 b(w)n(ere)f(able)h(to)g(resp)r(ond)f(to)
+h(an)n(y)f(k)n(eyw)n(ord)g(query)g(without)h(ha)n(ving)f(to)h(at)g
+(least)523 548 y(guess)26 b(the)h(k)n(eyw)n(ord,)e(they)i(could)f(use)h
+(this)g(to)g(spam)f(ev)n(ery)f(p)r(ossible)i(searc)n(h,)e(rendering)523
+648 y(the)33 b(k)n(eyw)n(ord)d(searc)n(h)h(mostly)h(useless.)f(F)-7
+b(orcing)32 b(resp)r(onders)f(to)h(guess)f(k)n(eyw)n(ords)f(do)r(es)523
+747 y(not)h(eliminate)f(the)h(problem)f(completely)-7
+b(.)31 b(Ho)n(w)n(ev)n(er,)d(it)j(do)r(es)f(limit)i(the)f(attac)n(k)e
+(to)i(the)523 847 y(common,)18 b(easily)g(guessed)g(k)n(eyw)n(ords.)f
+(Finally)-7 b(,)18 b(the)h(v)n(eri\014cation)f(that)h(a)f(resp)r(onse)f
+(is)i(v)-5 b(alid)523 946 y(should)27 b(b)r(e)h(p)r(ossible)g(not)f
+(only)g(for)h(the)f(\014nal)h(recipien)n(t,)f(but)h(also)f(for)g(in)n
+(termediaries.)648 1055 y(ECRS)38 b(ac)n(hiev)n(es)g(all)g(of)h(this)h
+(with)f(a)g Ft(new)h(crypto)l(gr)l(aphic)j(primitive)p
+FA(,)e(whic)n(h)e(is)f(a)523 1155 y(public-priv)-5 b(ate)35
+b(k)n(ey)g(pair)g(\()p Fq(P)1481 1167 y Fh(pub)1588 1155
+y FA(\()p Fq(K)6 b FA(\))p Fq(;)14 b(P)1819 1167 y Fh(pr)r(iv)1949
+1155 y FA(\()p Fq(K)6 b FA(\)\))36 b(that)g(is)f(generated)g(from)g(a)g
+(k)n(eyw)n(ord)523 1254 y Fq(K)6 b FA(.)34 b(The)g(k)n(eyw)n(ord)e
+Fq(K)40 b FA(is)33 b(used)h(as)g(the)g(seed)g(and)g(only)g(input)g(to)g
+(the)h(pseudo-random)523 1354 y(n)n(um)n(b)r(er)30 b(generator)e(that)i
+(is)g(used)g(in)g(the)h(generation)d(of)i(the)h(public-priv)-5
 b(ate)29 b(k)n(ey)h(pair.)523 1454 y(The)h(authors)f(are)g(not)i(a)n(w)
 n(are)d(of)i(an)n(y)f(previous)g(use)h(of)g Fq(K)6 b
-FA(-deterministic)31 b(public-k)n(eys.)523 1553 y(Giv)n(en)k(suc)n(h)f
-(a)h Fq(K)6 b FA(-deterministic)34 b(public-priv)-5 b(ate)34
-b(k)n(ey)-7 b(,)35 b(ECRS)f(generates)g Ft(KBlo)l(ck)p
-FA(s)h(b)n(y)523 1653 y(signing)27 b(the)h(metadata)e(necessary)g(to)h
-(do)n(wnload)g(the)g(\014le)h(with)g Fq(P)2675 1665 y
-Fh(pr)r(iv)2833 1653 y FA(b)n(y)f(the)h(inserting)523
-1753 y(p)r(eer.)36 b Ft(KBlo)l(ck)p FA(s)h(are)e(essen)n(tially)g(lik)n
-(e)g Ft(SBlo)l(ck)p FA(s)i(only)e(that)i(the)f Fq(K)6
-b FA(-determinate)35 b(k)n(ey)g(is)523 1852 y(used)28
-b(instead)f(of)h(the)g(pseudon)n(ym.)648 1961 y(A)e(p)r(eer)h(searc)n
-(hing)d(for)i Fq(K)32 b FA(also)25 b(computes)h Fq(P)2094
-1973 y Fh(pub)2202 1961 y FA(\()p Fq(K)6 b FA(\))26 b(using)g(the)h
-(same)f(deterministic)523 2060 y(k)n(ey-generation)31
-b(algorithm)i(\()p Fq(P)1555 2072 y Fh(pr)r(iv)1685 2060
-y FA(\()p Fq(K)6 b FA(\))34 b(is)f(also)g(computed)h(but)g(not)g
-(used\).)f(The)h(p)r(eer)523 2160 y(then)28 b(uses)f
-Fq(H)7 b FA(\()p Fq(P)1049 2172 y Fh(pub)1156 2160 y
-FA(\()p Fq(K)f FA(\)\))28 b(as)e(the)i(query)-7 b(.)27
-b(In)n(termediaries)e(can)i(v)n(erify)g(that)g(the)h(resp)r(onse)523
-2260 y(is)k(prop)r(erly)e(signed)h(b)n(y)h(a)f(public)h(k)n(ey)f(that)h
-(hashes)f(to)h(the)g(query)-7 b(,)31 b(but)h(are)f(unable)g(to)523
-2359 y(decrypt)h(the)h(resp)r(onse)e(or)h(learn)f(the)i
+FA(-deterministic)31 b(public-k)n(eys.)523 1553 y(Giv)n(en)37
+b(suc)n(h)f(a)h Fq(K)6 b FA(-deterministic)36 b(public-priv)-5
+b(ate)36 b(k)n(ey)-7 b(,)36 b(the)i(inserting)e(p)r(eer)h(generates)523
+1653 y Ft(KBlo)l(ck)p FA(s)k(b)n(y)g(signing)e(the)i(metadata)f
+(necessary)f(to)h(do)n(wnload)f(the)i(\014le)g(with)g
+Fq(P)3252 1665 y Fh(pr)r(iv)3382 1653 y FA(.)523 1753
+y Ft(KBlo)l(ck)p FA(s)d(are)f(essen)n(tially)f(lik)n(e)h
+Ft(SBlo)l(ck)p FA(s)h(only)f(that)h(the)g Fq(K)6 b FA(-determinate)36
+b(k)n(ey)h(is)g(used)523 1852 y(instead)27 b(of)h(the)g(pseudon)n(ym.)
+648 1961 y(A)e(p)r(eer)h(searc)n(hing)d(for)i Fq(K)32
+b FA(also)25 b(computes)h Fq(P)2094 1973 y Fh(pub)2202
+1961 y FA(\()p Fq(K)6 b FA(\))26 b(using)g(the)h(same)f(deterministic)
+523 2060 y(k)n(ey-generation)31 b(algorithm)i(\()p Fq(P)1555
+2072 y Fh(pr)r(iv)1685 2060 y FA(\()p Fq(K)6 b FA(\))34
+b(is)f(also)g(computed)h(but)g(not)g(used\).)f(The)h(p)r(eer)523
+2160 y(then)28 b(uses)f Fq(H)7 b FA(\()p Fq(P)1049 2172
+y Fh(pub)1156 2160 y FA(\()p Fq(K)f FA(\)\))28 b(as)e(the)i(query)-7
+b(.)27 b(In)n(termediaries)e(can)i(v)n(erify)g(that)g(the)h(resp)r
+(onse)523 2260 y(is)k(prop)r(erly)e(signed)h(b)n(y)h(a)f(public)h(k)n
+(ey)f(that)h(hashes)f(to)h(the)g(query)-7 b(,)31 b(but)h(are)f(unable)g
+(to)523 2359 y(decrypt)h(the)h(resp)r(onse)e(or)h(learn)f(the)i
 Fq(K)38 b FA(that)33 b(w)n(as)e(used)i(to)f(generate)f(the)i(public)g
 (k)n(ey)523 2459 y(without)28 b(guessing.)648 2568 y(In)k(conclusion,)g
 (using)h Ft(KBlo)l(ck)p FA(s)g(it)g(is)g(p)r(ossible)f(to)g(allo)n(w)g
@@ -7150,21 +7153,21 @@
 SDict begin [ /View [/XYZ H.V] /Dest (section.1.4) cvn H.B /DEST pdfmark
 end
  523
-3973 a 109 x Fu(4)112 b(Extensions)523 4327 y FA(The)33
-b(v)-5 b(anilla)32 b(ECRS)g(enco)r(ding)g(sc)n(heme)g(\(as)g(discussed)
-g(in)g(the)h(previous)e(section\))i(still)523 4426 y(lea)n(v)n(es)22
-b(some)h(practical)f(problems)h(that)g(should)g(b)r(e)h(addressed)e(to)
-h(facilitate)h(real-life)e(us-)523 4526 y(abilit)n(y)-7
-b(.)25 b(F)-7 b(or)25 b(example,)h(the)g(man)n(ual)f(e\013ort)g(of)h
-(assigning)e(or)g(guessing)h(k)n(eyw)n(ords)e(should)523
-4625 y(b)r(e)h(minimized.)g(Also,)f(the)h(o)n(v)n(erall)d(system)j
-(should)f(b)r(e)h(e\016cien)n(t)f(in)h(practice;)f(th)n(us,)g(o)n(v)n
-(er-)523 4725 y(head)32 b(caused)g(b)n(y)g(random)g(accesses)f(of)i
-(small)f(blo)r(c)n(ks)g(and)g(frequen)n(t)g(queries)g(m)n(ust)h(b)r(e)
-523 4825 y(handled)j(prop)r(erly)-7 b(.)35 b(The)i(follo)n(wing)e
-(subsections)g(presen)n(t)h(some)f(ideas)h(on)f(ho)n(w)h(these)523
-4924 y(issues)27 b(can)g(b)r(e)h(addressed.)p Black Black
-eop end
+3973 a 109 x Fu(4)112 b(Extensions)523 4327 y FA(The)38
+b(v)-5 b(anilla)38 b(ECRS)g(enco)r(ding)f(sc)n(heme)h(still)g(lea)n(v)n
+(es)f(some)g(practical)g(problems)h(that)523 4426 y(should)19
+b(b)r(e)g(addressed)f(to)h(facilitate)g(real-life)f(usabilit)n(y)-7
+b(.)19 b(F)-7 b(or)18 b(example,)h(the)g(man)n(ual)f(e\013ort)523
+4526 y(of)25 b(assigning)f(or)g(guessing)g(k)n(eyw)n(ords)f(should)i(b)
+r(e)h(minimized.)g(Also,)f(the)g(o)n(v)n(erall)e(system)523
+4625 y(should)36 b(b)r(e)h(e\016cien)n(t)g(in)g(practice.)f(In)h
+(particular,)e(this)i(requires)f(p)r(eers)g(to)g(frequen)n(tly)523
+4725 y(handle)j(small,)f(p)r(er-blo)r(c)n(k)g(queries,)g(man)n(y)g(of)g
+(whic)n(h)h(ma)n(y)f(not)h(ha)n(v)n(e)e(a)h(answ)n(er)g(that)523
+4825 y(is)31 b(lo)r(cally)f(a)n(v)-5 b(ailable.)30 b(The)h(follo)n
+(wing)f(subsections)g(presen)n(t)g(some)h(ideas)f(on)h(ho)n(w)f(these)
+523 4924 y(issues)d(can)g(b)r(e)h(addressed.)p Black
+Black eop end
 %%Page: 13 13
 TeXDict begin 13 12 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop
@@ -7348,23 +7351,23 @@
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.4.1) cvn H.B /DEST
 pdfmark end
  523 3283 a 83 x Fr(4.1)95 b(Keyw)m(ord)32
-b(inference)523 3613 y FA(One)26 b(problem)f(with)i(ECRS)e(is)h(that)g
-(the)h(con)n(ten)n(t)e(m)n(ust)h(often)h(b)r(e)f(asso)r(ciated)f(with)h
-(k)n(ey-)523 3713 y(w)n(ords.)20 b(Although)i(this)g(is)g(v)-5
-b(astly)21 b(b)r(etter)h(than)g(forcing)f(the)h(user)f(to)h(rely)f(on)g
-(meaningless)523 3812 y(bitstrings)27 b(as)g(the)h(only)f(iden)n
-(ti\014er,)h(the)g(k)n(eys)e(m)n(ust)i(still)g(b)r(e)g(c)n(hosen)e(so)h
-(that)h(the)g(target)523 3912 y(audience)g(can)h(guess)e(them.)i(The)g
-(simplest)g(non-tec)n(hnical)e(solution)i(for)f(this)g(problem,)523
-4012 y(ho)n(w)n(ev)n(er,)f(is)h(for)g(a)g(group)g(of)g(users)g(to)g
-(agree)f(on)h(an)h(informal)f(standard)f(for)h(k)n(eyw)n(ords.)523
-4111 y(If)23 b(con)n(ten)n(t)g(pro)n(viders)e(w)n(an)n(t)h(to)h(mak)n
-(e)f(it)i(easy)e(for)g(others)g(to)h(guess)f(a)h(k)n(eyw)n(ord,)e(it)i
-(is)g(t)n(yp-)523 4211 y(ically)29 b(useful)h(to)g(follo)n(w)f
-(informal)g(con)n(v)n(en)n(tions)f(for)h(k)n(eyw)n(ord)f(selection.)h
-(F)-7 b(or)29 b(example,)523 4310 y(a)e(reasonable)f(con)n(v)n(en)n
-(tion)g(ma)n(y)h(b)r(e)h(to)f(only)g(use)h(lo)n(w)n(er-case.)648
-4426 y(A)g(larger)f(problem)h(for)g(a)g(k)n(eyw)n(ord-based)e(searc)n
+b(inference)523 3613 y FA(One)40 b(problem)g(with)i(ECRS)e(is)g(that)h
+(the)g(con)n(ten)n(t)g(m)n(ust)f(often)h(b)r(e)g(asso)r(ciated)e(with)
+523 3713 y(k)n(eyw)n(ords.)23 b(Although)i(this)h(is)f(v)-5
+b(astly)25 b(b)r(etter)g(than)g(forcing)g(the)g(user)g(to)g(rely)f(on)h
+(\\mean-)523 3812 y(ingless")33 b(bitstrings)g(as)g(the)i(only)e(iden)n
+(ti\014er,)h(the)g(k)n(eys)f(m)n(ust)h(still)g(b)r(e)h(c)n(hosen)e(so)g
+(that)523 3912 y(the)25 b(target)f(audience)g(can)h(guess)f(them.)h
+(The)g(simplest)g(non-tec)n(hnical)e(solution)i(for)f(this)523
+4012 y(problem)g(is)g(for)f(a)h(group)f(of)h(users)g(to)g(agree)e(on)i
+(an)g(informal)g(standard)f(for)g(k)n(eyw)n(ords.)g(If)523
+4111 y(con)n(ten)n(t)28 b(pro)n(viders)e(w)n(an)n(t)i(to)g(mak)n(e)f
+(it)i(easy)e(for)h(others)f(to)h(guess)f(a)h(k)n(eyw)n(ord,)f(it)h(is)g
+(t)n(yp-)523 4211 y(ically)h(useful)h(to)g(follo)n(w)f(informal)g(con)n
+(v)n(en)n(tions)f(for)h(k)n(eyw)n(ord)f(selection.)h(F)-7
+b(or)29 b(example,)523 4310 y(a)e(reasonable)f(con)n(v)n(en)n(tion)g
+(ma)n(y)h(b)r(e)h(to)f(only)g(use)h(lo)n(w)n(er-case)d(letters.)648
+4426 y(A)j(larger)f(problem)h(for)g(a)g(k)n(eyw)n(ord-based)e(searc)n
 (h)h(is)h(that)h(users)f(ma)n(y)g(b)r(e)h(reluctan)n(t)523
 4526 y(to)e(put)g(in)g(the)g(e\013ort)f(to)g(pro)n(vide)g(go)r(o)r(d)g
 (k)n(eyw)n(ords)e(for)i(the)h(con)n(ten)n(t)f(that)h(they)g(pro)n
@@ -7410,103 +7413,104 @@
 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.4.2) cvn H.B /DEST
 pdfmark end
- 523 365 a 83 x Fr(4.2)95 b(Directories)523 617 y FA(Another)25
+ 523 365 a 83 x Fr(4.2)95 b(Directories)523 584 y FA(Another)25
 b(approac)n(h)e(to)i(a)n(v)n(oiding)e(searc)n(hes)g(is)i(to)g(group)e
-(\014les)i(in)n(to)g(directories.)f(Directo-)523 716
+(\014les)i(in)n(to)g(directories.)f(Directo-)523 684
 y(ries)k(can)g(help)h(with)h(the)f(searc)n(h)e(problem)h(since)h(they)f
-(reduce)h(the)g(need)g(for)f(searc)n(hing.)523 816 y(Also,)i(they)h
+(reduce)h(the)g(need)g(for)f(searc)n(hing.)523 784 y(Also,)i(they)h
 (can)f(b)r(e)h(used)f(to)g(bundle)h(similar)f(con)n(ten)n(t)g(and)g(th)
-n(us)h(help)g(users)e(a)n(v)n(oid)g(in-)523 916 y(appropriately)g(lab)r
+n(us)h(help)g(users)e(a)n(v)n(oid)g(in-)523 883 y(appropriately)g(lab)r
 (eled)h(data.)h(If)g(sev)n(eral)d(\014les)j(of)g(suc)n(h)f(a)g
-(directory)f(ha)n(v)n(e)h(appropriate)523 1015 y(descriptions,)k(it)h
+(directory)f(ha)n(v)n(e)h(appropriate)523 983 y(descriptions,)k(it)h
 (is)g(lik)n(ely)f(that)h(the)g(other)f(\014les)h(will)g(also)f(ha)n(v)n
-(e)f(b)r(een)i(pro)n(vided)f(b)n(y)g(a)523 1115 y(non-malicious)26
-b(part)n(y)-7 b(.)648 1215 y(In)n(tegrating)38 b(directories)g(in)n(to)
+(e)f(b)r(een)i(pro)n(vided)f(b)n(y)g(a)523 1082 y(non-malicious)26
+b(part)n(y)-7 b(.)648 1182 y(In)n(tegrating)38 b(directories)g(in)n(to)
 i(the)g(ECRS)f(sc)n(heme)g(is)h(fairly)f(straigh)n(tforw)n(ard.)e(A)523
-1315 y(directory)29 b(is)h(a)g(\014le)h(with)g(a)f(standard)f(\(1k\))h
-(header)g(blo)r(c)n(k)g(that)g(con)n(tains)g(an)n(y)f(n)n(um)n(b)r(er)
-523 1414 y(of)g Ft(SBlo)l(ck)p FA(s)i(or)d Ft(KBlo)l(ck)p
-FA(s)i(in)g(plain)n(text)g(\(!\).)g(Lik)n(e)f(\014les,)g(directories)f
-(are)h(imm)n(utable)g(and)523 1514 y(are)e(sub)5 b(jected)27
-b(to)h(the)g(same)f(enco)r(ding.)648 1614 y(Note)c(that)g(it)h(is)f(p)r
-(ossible)g(for)g(an)n(y)f(user)h(to)g(assem)n(ble)f(a)h(directory)f
-(that)h(refers)g(to)g(an)n(y)523 1714 y(com)n(bination)i(of)h(\014les:)
-g(user-inserted)f(\014les,)h(\014les)g(that)h(the)f(user)g(do)n
-(wnloaded,)f(\014les)h(that)523 1813 y(the)21 b(user)e(encoun)n(tered)g
-(as)h(searc)n(h)e(results)i(but)h(nev)n(er)e(do)n(wnloaded,)g(or)g(ev)n
-(en)g(in)n(v)-5 b(alid)20 b(data)523 1913 y(\(whic)n(h)34
-b(will)g(b)r(e)g(in)n(terpreted)g(as)f(references)g(that)h(corresp)r
-(ond)e(to)i(non-existen)n(t)f(\014les\).)523 2013 y(Directories)28
-b(can)h(also)f(refer)h(to)g(other)g(directories,)f(allo)n(wing)g(users)
-g(to)i(build)g(na)n(vigable)523 2112 y(structures)35
-b(similar)h(to)g(\014le)g(systems)g(\(without)h(delete)f(or)f(up)r
-(date)i(op)r(eration\))e(or)h(the)523 2212 y(W)-7 b(orld)25
-b(Wide)g(W)-7 b(eb.)26 b(While)f(deletions)g(and)g(up)r(dates)g(are)f
-(not)h(p)r(ossible,)f(it)i(is)f(p)r(ossible)f(to)523
-2311 y(refer)h(to)g(con)n(ten)n(ts)g(of)g(other)g(users)f(and)h(ev)n
-(en)g(to)h(\014les)f(or)f(directories)g(that)i(are)e(supp)r(osed)523
-2411 y(to)k(b)r(e)g(published)g(in)f(the)h(future.)523
-2579 y
+1282 y(directory)f(is)h(simply)h(a)f(\014le)g(that)h(con)n(tains)e(an)n
+(y)h(n)n(um)n(b)r(er)g(of)g Ft(SBlo)l(ck)p FA(s)h(or)f
+Ft(KBlo)l(ck)p FA(s)h(in)523 1381 y(plain)n(text)25 b(\(!\).)h(Lik)n(e)
+f(\014les,)g(directories)f(are)g(imm)n(utable)i(and)f(are)f(sub)5
+b(jected)26 b(to)f(the)h(same)523 1481 y(enco)r(ding)h(for)g(sharing.)
+648 1581 y(Note)k(that)h(it)h(is)e(p)r(ossible)h(for)f(users)g(to)h
+(assem)n(ble)e(a)i(directory)e(that)i(refers)f(to)h(an)n(y)523
+1680 y(com)n(bination)d(of)h(\014les:)g(\014les)g(the)g(user)f
+(inserted)h(p)r(ersonally)-7 b(,)28 b(\014les)i(that)g(the)h(user)e(do)
+n(wn-)523 1780 y(loaded,)21 b(\014les)g(that)g(the)h(user)e(encoun)n
+(tered)h(as)f(searc)n(h)g(results)h(but)h(nev)n(er)e(do)n(wnloaded,)g
+(or)523 1879 y(ev)n(en)29 b(in)n(v)-5 b(alid)30 b(data)f(\(whic)n(h)h
+(w)n(ould)g(b)r(e)g(in)n(terpreted)f(as)g(references)g(that)h(corresp)r
+(ond)e(to)523 1979 y(non-existen)n(t)g(\014les\).)h(Directories)e(can)h
+(also)g(refer)f(to)i(other)f(directories,)f(allo)n(wing)g(users)523
+2079 y(to)g(build)h(na)n(vigable)d(structures)h(similar)h(to)g(\014le)g
+(systems)f(or)g(the)i(W)-7 b(orld)27 b(Wide)g(W)-7 b(eb.)28
+b(In)523 2178 y(particular)k(it)i(is)f(p)r(ossible)g(to)g(refer)f(to)h
+(con)n(ten)n(ts)g(of)g(other)g(users)f(and)h(ev)n(en)g(to)g(\014les)g
+(or)523 2278 y(directories)26 b(that)i(are)f(supp)r(osed)g(to)h(b)r(e)g
+(published)g(in)f(the)h(future.)523 2413 y
 SDict begin H.S end
- 523 2579 a 523 2579 a
+ 523 2413 a
+523 2413 a
 SDict begin 12 H.A end
- 523 2579 a 523 2579 a
+ 523 2413 a 523 2413 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.4.3) cvn H.B /DEST
 pdfmark end
- 523
-2579 a 84 x Fr(4.3)95 b(E\016cien)m(t)31 b(lo)s(okups)f(with)i(blo)s
-(om)e(\014lters)523 2831 y FA(Giv)n(en)24 b(that)h(a)g(query)e(only)i
-(requires)e(the)i(transmission)e(of)i(a)f(hash)g(co)r(de,)h(the)g(n)n
-(um)n(b)r(er)f(of)523 2931 y(queries)29 b(that)i(an)n(y)e(giv)n(en)g(p)
-r(eer)h(ma)n(y)f(receiv)n(e)g(is)h(quite)g(high.)g(The)g(bandwidth)h
-(required)523 3030 y(for)g(the)h(resp)r(onse)e(can)h(generally)f(b)r(e)
-i(discoun)n(ted,)f(since)g(eac)n(h)g(p)r(eer)g(will)h(only)f(b)r(e)g
-(able)523 3130 y(to)36 b(resp)r(ond)f(to)h(a)g(small)g(fraction)f(of)h
-(the)g(receiv)n(ed)f(queries.)h(Assuming)g(that)g(queries)523
-3230 y(dominate)23 b(the)g(tra\016c,)g(o)n(v)n(er)e(50)h(queries)g(p)r
-(er)h(second)g(could)g(b)r(e)g(transmitted)g(o)n(v)n(er)e(a)i(slo)n(w)
-523 3329 y(mo)r(dem)h(line.)h(Man)n(y)e(p)r(eers)h(could)g(not)g(p)r
-(erform)f(disk-based)g(database)g(lo)r(okups)g(at)h(suc)n(h)523
-3429 y(rates.)h(W)-7 b(orse,)25 b(if)h(p)r(eers)g(are)f(sharing)f
-(gigab)n(ytes)g(of)i(con)n(ten)n(t,)g(simply)g(k)n(eeping)f(the)h
-(index)523 3529 y(information)h(in)h(memory)f(is)g(also)g(often)g(no)h
-(longer)e(feasible.)648 3629 y(In)k(order)f(to)h(dramatically)e(reduce)
-i(the)g(necessary)f(n)n(um)n(b)r(er)h(of)g(database)f(accesses,)523
-3728 y(ECRS)c(can)g(b)r(e)g(supplemen)n(ted)h(with)f(a)g(blo)r(om)g
-(\014lter)g([)p 0 1 0 TeXcolorrgb 2275 3728 a
+ 523 2413 a 84 x Fr(4.3)95
+b(E\016cien)m(t)31 b(lo)s(okups)f(with)i(blo)s(om)e(\014lters)523
+2633 y FA(Giv)n(en)24 b(that)h(a)g(query)e(only)i(requires)e(the)i
+(transmission)e(of)i(a)f(hash)g(co)r(de,)h(the)g(n)n(um)n(b)r(er)f(of)
+523 2733 y(queries)19 b(that)i(an)n(y)e(giv)n(en)g(p)r(eer)h(ma)n(y)f
+(receiv)n(e)g(is)h(quite)h(high.)f(The)g(bandwidth)g(required)g(for)523
+2832 y(the)28 b(resp)r(onse)f(can)g(often)h(b)r(e)g(discoun)n(ted,)f
+(since)h(a)f(p)r(eer)g(ma)n(y)g(only)h(b)r(e)g(able)f(to)h(resp)r(ond)
+523 2932 y(to)c(a)g(fraction)g(of)g(the)h(receiv)n(ed)e(queries.)h
+(Assuming)g(that)h(queries)f(dominate)g(the)g(tra\016c,)523
+3031 y(o)n(v)n(er)i(50)h(queries)h(p)r(er)f(second)h(could)g(b)r(e)g
+(transmitted)g(o)n(v)n(er)e(a)i(slo)n(w)f(mo)r(dem)h(line.)h(Man)n(y)
+523 3131 y(p)r(eers)35 b(could)h(not)g(p)r(erform)f(disk-based)g
+(database)g(lo)r(okups)g(at)h(suc)n(h)f(rates.)g(W)-7
+b(orse,)35 b(if)523 3231 y(p)r(eers)28 b(are)f(sharing)g(gigab)n(ytes)g
+(of)h(con)n(ten)n(t,)g(simply)g(k)n(eeping)g(the)h(index)f(information)
+g(in)523 3330 y(memory)f(is)g(also)g(often)h(no)f(longer)f(feasible.)
+648 3430 y(In)k(order)f(to)h(dramatically)e(reduce)i(the)g(necessary)f
+(n)n(um)n(b)r(er)h(of)g(database)f(accesses,)523 3530
+y(ECRS)c(can)g(b)r(e)g(supplemen)n(ted)h(with)f(a)g(blo)r(om)g
+(\014lter)g([)p 0 1 0 TeXcolorrgb 2275 3530 a
 SDict begin H.S end
- 2275 3728
-a 0 1 0 TeXcolorrgb FA(3)p 0 1 0 TeXcolorrgb 2316 3675
+ 2275 3530
+a 0 1 0 TeXcolorrgb FA(3)p 0 1 0 TeXcolorrgb 2316 3476
 a
 SDict begin H.R end
- 2316 3675 a 2316 3728 a
+ 2316 3476 a 2316 3530 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.bloom) cvn H.B /ANN pdfmark end
- 2316 3728 a Black FA(],)h(whic)n(h)f(is)g(a)f
-(probabilistic)g(data)523 3828 y(structure)39 b(that)h(uses)f(little)h
+ 2316 3530 a Black FA(],)h(whic)n(h)f(is)g(a)f
+(probabilistic)g(data)523 3629 y(structure)39 b(that)h(uses)f(little)h
 (memory)f(and)g(can)g(b)r(e)h(used)g(to)f(\014lter)h(out)f(queries)g
-(that)523 3928 y(de\014nitely)29 b(cannot)f(b)r(e)i(answ)n(ered)d(b)n
+(that)523 3729 y(de\014nitely)29 b(cannot)f(b)r(e)i(answ)n(ered)d(b)n
 (y)h(the)h(lo)r(cal)g(p)r(eer.)f(The)h(blo)r(om)f(\014lter)h(is)g
-(guaran)n(teed)523 4027 y(to)21 b(allo)n(w)f(all)g(queries)h(that)g
+(guaran)n(teed)523 3828 y(to)21 b(allo)n(w)f(all)g(queries)h(that)g
 (can)f(b)r(e)i(lo)r(cally)e(answ)n(ered)f(through)i(the)g(\014lter,)g
-(and)g(will)g(reject)523 4127 y(all)33 b(but)h(a)f(statistically)g
+(and)g(will)g(reject)523 3928 y(all)33 b(but)h(a)f(statistically)g
 (insigni\014can)n(t)f(n)n(um)n(b)r(er)h(of)h(queries)e(that)i(cannot)f
-(b)r(e)g(answ)n(ered)523 4226 y(lo)r(cally)-7 b(.)648
-4327 y(The)24 b(size)g(of)g(the)h(blo)r(om)f(\014lter)g(in)g(memory)g
+(b)r(e)g(answ)n(ered)523 4028 y(lo)r(cally)-7 b(.)648
+4127 y(The)24 b(size)g(of)g(the)h(blo)r(om)f(\014lter)g(in)g(memory)g
 (that)g(is)g(required)g(to)g(reduce)g(the)g(n)n(um)n(b)r(er)523
-4426 y(of)19 b(false-p)r(ositiv)n(es)f(to)i(appro)n(ximately)d(3\045)j
+4227 y(of)19 b(false-p)r(ositiv)n(es)f(to)i(appro)n(ximately)d(3\045)j
 (is)f(ab)r(out)g(one)g(b)n(yte)h(\(8)f(bit)h(with)g(5)f(blo)r(om)g
-(tests,)523 4526 y(2)565 4496 y Fc(\000)p Fz(5)685 4526
-y Fb(\031)30 b FA(3\045\))i(p)r(er)h(en)n(try)-7 b(.)31
-b(Since)i(a)f(no)r(de)g(o)r(ccasionally)f(needs)h(to)g(remo)n(v)n(e)e
-(con)n(ten)n(t)i(from)523 4625 y(the)27 b(lo)r(cal)e(database,)h
-(additional)f(bit)i(coun)n(ters)e(for)h(the)h(blo)r(om)f(\014lter)g
-(are)f(stored)h(on)g(the)523 4725 y(disk.)g(The)g(assumption)f(here)h
-(is)g(that)g(c)n(hanges)e(to)i(the)h(\014lter)f(are)f(rare)f(compared)h
-(to)h(the)523 4825 y(frequency)31 b(of)g(queries.)g(Queries)f(that)i
-(pass)e(through)h(the)h(blo)r(om)f(\014lter)g(are)g(forw)n(arded)523
-4924 y(to)d(the)f(database)g(la)n(y)n(er)f(whic)n(h)h(then)h(attempts)g
-(to)g(lo)r(cate)f(the)h(con)n(ten)n(t.)p Black Black
+(tests,)523 4327 y(2)565 4296 y Fc(\000)p Fz(5)677 4327
+y Fb(\031)j FA(3\045\))28 b(p)r(er)f(en)n(try)-7 b(.)27
+b(This)g(reduces)g(the)h(memory)e(requiremen)n(ts)g(for)h(the)h(index)f
+(b)n(y)g(a)523 4426 y(factor)19 b(of)g(16-64,)f(dep)r(ending)i(on)f
+(the)h(size)g(of)f(the)h(hash.)g(Since)f(a)h(no)r(de)f(o)r(ccasionally)
+f(needs)523 4526 y(to)23 b(remo)n(v)n(e)f(con)n(ten)n(t)h(from)h(the)f
+(lo)r(cal)g(database,)g(additional)g(bit)h(coun)n(ters)e(for)h(the)h
+(blo)r(om)523 4625 y(\014lter)29 b(should)h(b)r(e)f(stored)g(on)g(the)h
+(disk.)f(The)h(assumption)e(here)h(is)h(that)f(c)n(hanges)f(to)i(the)
+523 4725 y(\014lter)g(are)f(rare)g(compared)g(to)h(the)g(frequency)g
+(of)g(queries.)f(Queries)g(that)h(pass)g(through)523
+4825 y(the)38 b(blo)r(om)f(\014lter)h(are)e(forw)n(arded)g(to)i(the)g
+(database)e(la)n(y)n(er)g(whic)n(h)h(then)h(attempts)g(to)523
+4924 y(lo)r(cate)27 b(the)h(con)n(ten)n(t.)p Black Black
 eop end
 %%Page: 15 15
 TeXDict begin 15 14 bop 0 0 a
@@ -7547,113 +7551,114 @@
 i(if)f(the)g(user)g(in)n(tends)f(to)h(k)n(eep)f(the)i(\014le)f(in)g
 (plain)n(text)f(on)523 1138 y(the)i(lo)r(cal)g(driv)n(e.)f(In)h(this)g
 (case,)f(the)h(system)g(can)f(index)h(the)h Ft(DBlo)l(cks)g
-FA(without)f(replicating)523 1237 y(the)36 b(actual)e(data,)h(storing)f
-(the)i(resulting)e Ft(IBlo)l(cks)j FA(\(and)e Ft(SBlo)l(cks)h
-FA(and)g Ft(KBlo)l(cks)p FA(\))g(and)523 1337 y(then)26
-b(later)e(pro)r(ducing)g(the)i Ft(DBlo)l(cks)g FA(only)e(using)h(the)g
-(index.)g(This)g(can)g(result)g(in)g(rather)523 1437
-y(dramatic)i(sa)n(vings)f(in)i(space)e(\(no)i(replication)f(of)g(enco)r
-(ded)h(con)n(ten)n(t\).)648 1536 y(Splitting)j(\014les)g(in)n(to)g(blo)
-r(c)n(ks)f(migh)n(t)g(b)r(e)i(p)r(erceiv)n(ed)e(as)g(ha)n(ving)g(a)g
-(negativ)n(e)g(e\013ect)h(on)523 1636 y(the)25 b(preserv)-5
-b(ation)23 b(of)h(data.)g(If)h(only)f(one)g(of)h(the)g(small)f(pieces)g
-(is)g(lost,)g(the)h(larger)e(\014le)h(can)523 1736 y(no)j(longer)g(b)r
-(e)h(reconstructed.)f(Th)n(us,)g(man)n(y)g(other)h(systems)f([)p
-0 1 0 TeXcolorrgb 2550 1736 a
+FA(without)f(replicating)523 1237 y(the)28 b(actual)g(data)f
+(completely)-7 b(,)28 b(storing)f(only)h(the)g(resulting)g
+Ft(IBlo)l(cks)h FA(\(and)f Ft(SBlo)l(cks)h FA(and)523
+1337 y Ft(KBlo)l(cks)p FA(\))37 b(and)e(then)g(later)g(pro)r(ducing)f
+(the)i Ft(DBlo)l(cks)g FA(only)f(using)g(the)g(index)h(and)f(the)523
+1437 y(original)28 b(\014le.)h(This)g(can)g(result)g(in)g(rather)f
+(dramatic)g(sa)n(vings)g(in)h(space)g(\(no)g(replication)523
+1536 y(of)f(enco)r(ded)f(con)n(ten)n(t\).)648 1636 y(Splitting)k
+(\014les)g(in)n(to)g(blo)r(c)n(ks)f(migh)n(t)g(b)r(e)i(p)r(erceiv)n(ed)
+e(as)g(ha)n(ving)g(a)g(negativ)n(e)g(e\013ect)h(on)523
+1736 y(the)38 b(preserv)-5 b(ation)37 b(of)h(data.)f(If)i(only)e(one)h
+(of)g(the)g(blo)r(c)n(ks)f(is)h(lost,)g(the)g(larger)e(\014le)i(can)523
+1835 y(no)27 b(longer)g(b)r(e)h(reconstructed.)f(Th)n(us,)g(man)n(y)g
+(other)h(systems)f([)p 0 1 0 TeXcolorrgb 2550 1835 a
 SDict begin H.S end
- 2550 1736 a 0 1 0 TeXcolorrgb
-FA(9)p 0 1 0 TeXcolorrgb 2591 1682 a
+
+2550 1835 a 0 1 0 TeXcolorrgb FA(9)p 0 1 0 TeXcolorrgb
+2591 1782 a
 SDict begin H.R end
- 2591 1682 a 2591
-1736 a
+ 2591 1782 a 2591 1835 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.freehaven-berk) cvn H.B /ANN pdfmark end
- 2591 1736 a Black FA(,)p 0 1 0 TeXcolorrgb 2614
-1736 a
+ 2591 1835 a Black
+FA(,)p 0 1 0 TeXcolorrgb 2614 1835 a
 SDict begin H.S end
- 2614 1736 a 0 1 0 TeXcolorrgb FA(30)p 0 1 0 TeXcolorrgb
-2698 1682 a
+ 2614 1835 a 0 1 0
+TeXcolorrgb FA(30)p 0 1 0 TeXcolorrgb 2698 1782 a
 SDict begin H.R end
- 2698 1682 a 2698 1736 a
+ 2698
+1782 a 2698 1835 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.mojotech) cvn H.B /ANN pdfmark end
- 2698 1736 a Black
-FA(])g(striv)n(e)g(to)h(k)n(eep)f(\014les)523 1835 y(in)n(tact)20
-b(or)e(use)i(erasure)d(co)r(des)i([)p 0 1 0 TeXcolorrgb
-1499 1835 a
+ 2698 1835 a Black FA(])g(striv)n(e)g(to)h(k)n(eep)f
+(\014les)523 1935 y(in)n(tact)20 b(or)e(use)i(erasure)d(co)r(des)i([)p
+0 1 0 TeXcolorrgb 1499 1935 a
 SDict begin H.S end
- 1499 1835 a 0 1 0 TeXcolorrgb FA(22)p 0 1 0
-TeXcolorrgb 1583 1782 a
+ 1499 1935 a 0 1 0 TeXcolorrgb
+FA(22)p 0 1 0 TeXcolorrgb 1583 1881 a
 SDict begin H.R end
- 1583 1782 a 1583 1835 a
+ 1583 1881 a 1583
+1935 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.rabin89efficient) cvn H.B /ANN pdfmark end
- 1583
-1835 a Black FA(])g(to)h(patc)n(h)f(missing)g(pieces.)g(While)h
-(erasure)e(co)r(des)h(could)523 1935 y(b)r(e)26 b(used)g(together)f
-(with)i(ECRS,)e(they)i(w)n(ould)e(con\015ict)h(with)g(the)h(p)r
-(erformance)d(b)r(ene\014ts)523 2034 y(of)h(on-demand)f(enco)r(ding.)g
-(Consequen)n(tly)-7 b(,)24 b(the)h(primary)f(mec)n(hanism)g(to)h(guard)
-e(against)523 2134 y(the)31 b(loss)e(of)i(\014les)f(enco)r(ded)g(with)h
-(ECRS)f(should)g(b)r(e)h(data)f(replication.)f(Since)i(ECRS)f(is)523
-2234 y(splitting)22 b(\014les)g(in)n(to)f(blo)r(c)n(ks)g(it)h(should)g
-(b)r(e)g(p)r(ossible)g(for)f(the)h(net)n(w)n(ork)e(to)i(duplicate)g
-(blo)r(c)n(ks)523 2333 y(at)34 b(a)f(negligible)g(cost)h(p)r(er)f(blo)r
-(c)n(k.)h(Duplicating)g(a)f(complete)h(\014le)g(of)g(sev)n(eral)e
-(gigab)n(ytes)523 2433 y(w)n(ould)j(b)r(e)h(m)n(uc)n(h)f(more)f(costly)
-h(and)g(more)g(lik)n(ely)g(to)g(fail.)g(F)-7 b(or)35
-b(large)f(\014les,)h(it)h(ma)n(y)f(b)r(e)523 2533 y(di\016cult)c(for)e
-(a)g(p)r(eer)h(to)g(\014nd)g(individual)g(hosts)g(that)g(are)f(willing)
-g(\(or)h(able\))f(to)h(pro)n(vide)523 2632 y(enough)c(space)g(to)h
-(replicate)f(the)h(complete)g(\014le)g(in)g(its)g(en)n(tiret)n(y)-7
-b(.)26 b(Also,)h(the)g(tra\016c)f(burst)523 2732 y(that)h(a)f(large)g
-(transfer)g(w)n(ould)g(imp)r(ose)h(on)f(the)h(net)n(w)n(ork)f(migh)n(t)
-g(k)n(eep)h(the)g(participating)523 2831 y(no)r(des)33
-b(busy)g(for)g(to)r(o)f(long.)h(Blo)r(c)n(ks,)f(on)h(the)g(other)g
-(hand,)g(can)g(migrate)f(quic)n(kly)g(from)523 2931 y(host)20
-b(to)h(host.)f(Storing)g(a)g(large)f(\014le)i(on)f(a)g(single)g(host)g
-(also)g(fails)g(to)g(facilitate)h(distribution)523 3031
-y(of)28 b(load)e(for)i(do)n(wnloading)e(purp)r(oses.)523
-3188 y
+ 1583 1935 a Black FA(])g(to)h(patc)n(h)f(missing)g(pieces.)g
+(While)h(erasure)e(co)r(des)h(could)523 2034 y(b)r(e)26
+b(used)g(together)f(with)i(ECRS,)e(they)i(w)n(ould)e(con\015ict)h(with)
+g(the)h(p)r(erformance)d(b)r(ene\014ts)523 2134 y(of)h(on-demand)f
+(enco)r(ding.)g(Consequen)n(tly)-7 b(,)24 b(the)h(primary)f(mec)n
+(hanism)g(to)h(guard)e(against)523 2234 y(the)31 b(loss)e(of)i(\014les)
+f(enco)r(ded)g(with)h(ECRS)f(should)g(b)r(e)h(data)f(replication.)f
+(Since)i(ECRS)f(is)523 2333 y(splitting)22 b(\014les)g(in)n(to)f(blo)r
+(c)n(ks)g(it)h(should)g(b)r(e)g(p)r(ossible)g(for)f(the)h(net)n(w)n
+(ork)e(to)i(duplicate)g(blo)r(c)n(ks)523 2433 y(at)34
+b(a)f(negligible)g(cost)h(p)r(er)f(blo)r(c)n(k.)h(Duplicating)g(a)f
+(complete)h(\014le)g(of)g(sev)n(eral)e(gigab)n(ytes)523
+2533 y(w)n(ould)j(b)r(e)h(m)n(uc)n(h)f(more)f(costly)h(and)g(more)g
+(lik)n(ely)g(to)g(fail.)g(F)-7 b(or)35 b(large)f(\014les,)h(it)h(ma)n
+(y)f(b)r(e)523 2632 y(di\016cult)c(for)e(a)g(p)r(eer)h(to)g(\014nd)g
+(individual)g(hosts)g(that)g(are)f(willing)g(\(or)h(able\))f(to)h(pro)n
+(vide)523 2732 y(enough)c(space)g(to)h(replicate)f(the)h(complete)g
+(\014le)g(in)g(its)g(en)n(tiret)n(y)-7 b(.)26 b(Also,)h(the)g(tra\016c)
+f(burst)523 2831 y(that)h(a)f(large)g(transfer)g(w)n(ould)g(imp)r(ose)h
+(on)f(the)h(net)n(w)n(ork)f(migh)n(t)g(k)n(eep)h(the)g(participating)
+523 2931 y(no)r(des)33 b(busy)g(for)g(to)r(o)f(long.)h(Blo)r(c)n(ks,)f
+(on)h(the)g(other)g(hand,)g(can)g(migrate)f(quic)n(kly)g(from)523
+3031 y(host)20 b(to)h(host.)f(Storing)g(a)g(large)f(\014le)i(on)f(a)g
+(single)g(host)g(also)g(fails)g(to)g(facilitate)h(distribution)523
+3130 y(of)28 b(load)e(for)i(do)n(wnloading)e(purp)r(oses.)523
+3288 y
 SDict begin H.S end
- 523 3188 a 523 3188 a
+ 523 3288 a 523 3288 a
 SDict begin 12 H.A end
- 523 3188 a 523 3188 a
+ 523 3288 a 523 3288 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.5.1) cvn H.B /DEST
 pdfmark end
  523
-3188 a 84 x Fr(5.1)95 b(A)m(ttac)m(ks)523 3430 y FA(ECRS)34
+3288 a 83 x Fr(5.1)95 b(A)m(ttac)m(ks)523 3530 y FA(ECRS)34
 b(is)f(op)r(en)h(to)g(t)n(w)n(o)f(t)n(yp)r(es)h(of)f(attac)n(ks)g(from)
 h(censors.)e(The)i(most)f(ob)n(vious)g(attac)n(k)523
-3530 y(a)n(v)-5 b(ailable)22 b(to)g(an)h(adv)n(ersary)d(is)j(to)g
-(guess)f(p)r(ossible)g(k)n(eyw)n(ords)f(and)i(use)g(those)f(to)h
-(compute)523 3629 y(queries)i(for)g(sp)r(eci\014c)h Ft(KBlo)l(ck)p
-FA(s.)g(The)g(adv)n(ersary)d(can)i(then)h(try)f(to)h(censor)e(these)i
-(queries.)523 3729 y(Since)g(the)g(same)f(con)n(ten)n(t)g(can)g(b)r(e)h
-(a)n(v)-5 b(ailable)25 b(under)g(man)n(y)g(k)n(eyw)n(ords,)f(this)i
-(tec)n(hnique)f(is)523 3828 y(not)j(necessary)e(successful.)h(Ho)n(w)n
-(ev)n(er,)f(this)i(guessing)e(attac)n(k)h(do)r(es)h(pro)n(vide)e(the)i
-(opp)r(or-)523 3928 y(tunit)n(y)k(for)f(limited)i(forms)e(of)g
-(censorship.)g(An)h(adv)n(ersary)c(could)k(create)e(a)i(\\blac)n
-(klist")523 4028 y(of)c(k)n(eyw)n(ords)d(and)j(attempt)g(to)g(legally)e
-(force)h(op)r(erators)f(to)h(\014lter)h(matc)n(hing)f(queries)g(or)523
-4127 y(replies.)648 4227 y(Instead)e(of)h(predicting)g(k)n(eyw)n(ords,)
-e(the)i(attac)n(k)n(er)e(can)i(also)f(try)h(to)f(obtain)h(the)h(exact)
-523 4327 y(con)n(ten)n(ts)37 b(of)h(the)g(\014le)g(\(or)f(at)h(least)g
-(the)g(exact)f(con)n(ten)n(ts)g(of)h(an)g(incriminating)f(part\).)523
-4426 y(This)d(ma)n(yb)r(e)f(ac)n(hiev)n(ed)g(b)n(y)g(searc)n(hing)f
-(the)i(net)n(w)n(ork)f(for)g(certain)g(k)n(eyw)n(ords)f(and)h(then)523
-4526 y(do)n(wnloading)i(the)i(resulting)g(con)n(ten)n(t.)f(This)h(w)n
-(a)n(y)f(the)h(attac)n(k)n(er)e(can)h(again)g(compute)523
-4625 y(the)e(query)e(for)h(the)h Ft(DBlo)l(ck)p FA(s)g(and)f
-Ft(IBlo)l(ck)p FA(s)h(and)f(also)g(obtain)g(the)g(encrypted)g
-Ft(DBlo)l(ck)p FA(s)523 4725 y(and)d Ft(IBlo)l(ck)p FA(s)h(themselv)n
-(es.)f(Again,)f(the)i(adv)n(ersary)c(can)j(then)g(try)g(to)g(censor)f
-(this)h(data.)523 4825 y(Note)25 b(that)g(this)h(attac)n(k)e(requires)g
-(the)h(adv)n(ersary)d(to)j(obtain)g(a)g(cop)n(y)f(of)h(the)h(con)n(ten)
-n(t)e(and)523 4924 y(then)g(exercise)f(a)g(certain)g(amoun)n(t)g(of)h
-(con)n(trol)e(o)n(v)n(er)g(the)i(p)r(eers)f(in)h(the)g(net)n(w)n(ork.)e
-(As)i(users)p Black Black eop end
+3629 y(is)40 b(to)g(guess)f(k)n(eyw)n(ords)f(and)i(use)g(those)f(to)h
+(compute)g(queries)f(for)h(sp)r(eci\014c)g Ft(KBlo)l(ck)p
+FA(s.)523 3729 y(The)28 b(adv)n(ersary)c(can)j(then)h(try)f(to)h
+(censor)e(these)h(queries.)g(Since)h(the)f(same)g(con)n(ten)n(t)g(can)
+523 3828 y(b)r(e)36 b(a)n(v)-5 b(ailable)33 b(under)i(man)n(y)g(k)n
+(eyw)n(ords,)e(this)j(tec)n(hnique)f(is)g(not)g(necessary)e
+(successful.)523 3928 y(Ho)n(w)n(ev)n(er,)25 b(this)i(guessing)f(attac)
+n(k)f(do)r(es)i(pro)n(vide)f(the)h(opp)r(ortunit)n(y)f(for)g(limited)i
+(forms)e(of)523 4028 y(censorship.)g(An)h(adv)n(ersary)c(could)k
+(create)e(a)i(\\blac)n(klist")e(of)h(k)n(eyw)n(ords)e(and)j(attempt)g
+(to)523 4127 y(legally)g(force)g(op)r(erators)e(to)j(\014lter)f(matc)n
+(hing)g(queries)g(or)g(replies.)648 4227 y(Instead)e(of)h(predicting)g
+(k)n(eyw)n(ords,)e(the)i(attac)n(k)n(er)e(can)i(also)f(try)h(to)f
+(obtain)h(the)h(exact)523 4327 y(con)n(ten)n(ts)37 b(of)h(the)g(\014le)
+g(\(or)f(at)h(least)g(the)g(exact)f(con)n(ten)n(ts)g(of)h(an)g
+(incriminating)f(part\).)523 4426 y(This)d(ma)n(yb)r(e)f(ac)n(hiev)n
+(ed)g(b)n(y)g(searc)n(hing)f(the)i(net)n(w)n(ork)f(for)g(certain)g(k)n
+(eyw)n(ords)f(and)h(then)523 4526 y(do)n(wnloading)i(the)i(resulting)g
+(con)n(ten)n(t.)f(This)h(w)n(a)n(y)f(the)h(attac)n(k)n(er)e(can)h
+(again)g(compute)523 4625 y(the)e(query)e(for)h(the)h
+Ft(DBlo)l(ck)p FA(s)g(and)f Ft(IBlo)l(ck)p FA(s)h(and)f(also)g(obtain)g
+(the)g(encrypted)g Ft(DBlo)l(ck)p FA(s)523 4725 y(and)d
+Ft(IBlo)l(ck)p FA(s)h(themselv)n(es.)f(Again,)f(the)i(adv)n(ersary)c
+(can)j(then)g(try)g(to)g(censor)f(this)h(data.)523 4825
+y(Note)25 b(that)g(this)h(attac)n(k)e(requires)g(the)h(adv)n(ersary)d
+(to)j(obtain)g(a)g(cop)n(y)f(of)h(the)h(con)n(ten)n(t)e(and)523
+4924 y(then)g(exercise)f(a)g(certain)g(amoun)n(t)g(of)h(con)n(trol)e(o)
+n(v)n(er)g(the)i(p)r(eers)f(in)h(the)g(net)n(w)n(ork.)e(As)i(users)p
+Black Black eop end
 %%Page: 16 16
 TeXDict begin 16 15 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop
@@ -7676,11 +7681,11 @@
 h(k)n(eyw)n(ord,)f(this)523 548 y(attac)n(k)j(cannot)g(b)r(e)i(a)n(v)n
 (oided.)d(A)i(fault-toleran)n(t)f(p)r(eer-to-p)r(eer)g(routing)g(proto)
 r(col)f(ma)n(y)i(b)r(e)523 648 y(able)i(to)h(route)f(the)h(con)n(ten)n
-(t)f(around)g(the)h(adv)n(ersary-con)n(trolled)23 b(censoring)j(p)r
-(eers.)648 748 y(If)39 b(suc)n(h)f(an)g(activ)n(e)g(censorship)f(attac)
-n(k)h(is)g(kno)n(wn)g(to)g(o)r(ccur)g(on)g(a)h(large)e(scale,)g(a)523
-848 y(p)r(ossible)26 b(defense)g(w)n(ould)g(b)r(e)h(to)f(publish)h(the)
-g(con)n(ten)n(t)e(with)i(sligh)n(t)f(alterations)f(for)h(eac)n(h)523
+(t)f(around)g(the)h(censoring)e(p)r(eers.)648 748 y(If)39
+b(suc)n(h)f(an)g(activ)n(e)g(censorship)f(attac)n(k)h(is)g(kno)n(wn)g
+(to)g(o)r(ccur)g(on)g(a)h(large)e(scale,)g(a)523 848
+y(p)r(ossible)26 b(defense)g(w)n(ould)g(b)r(e)h(to)f(publish)h(the)g
+(con)n(ten)n(t)e(with)i(sligh)n(t)f(alterations)f(for)h(eac)n(h)523
 947 y(k)n(eyw)n(ord.)20 b(A)h(single)g(space)g(inserted)g(at)g(the)h(b)
 r(eginning)f(of)g(a)g(text-do)r(cumen)n(t)h(is)f(su\016cien)n(t)523
 1047 y(to)34 b(c)n(hange)g Ft(al)t(l)h FA(blo)r(c)n(ks)f(of)g(the)h
@@ -7713,47 +7718,47 @@
 (censorship)g(should)g(b)r(e)h(impractical.)648 2045
 y(Another)j(serious)f(t)n(yp)r(e)i(of)g(attac)n(k)f(is)g(spamming)g
 (the)h(global)f(k)n(eyw)n(ord)f(space)g(with)523 2144
-y(useless)37 b(con)n(ten)n(t.)g(P)n(opular)f(k)n(eyw)n(ords)f(are)h(an)
-i(easy)e(target)h(since)g(they)h(are)e(lik)n(ely)h(to)523
-2244 y(b)r(e)31 b(easily)e(guessed)h(b)n(y)g(an)g(adv)n(ersary)-7
-b(.)28 b(Namespaces)h(can)h(theoretically)f(eliminate)i(this)523
-2344 y(problem,)k(ho)n(w)n(ev)n(er)e(they)j(create)f(a)g(new)g
-(di\016cult)n(y)h(in)g(assessing)d(whic)n(h)j(pseudon)n(yms)523
-2443 y(represen)n(t)29 b(users)h(that)g(pro)n(vide)f(v)-5
-b(aluable)30 b(con)n(ten)n(t.)g(A)h(secure)e(reputation)h(system,)g
-(lik)n(e)523 2543 y(Adv)n(ogato)38 b([)p 0 1 0 TeXcolorrgb
-934 2543 a
+y(useless)i(con)n(ten)n(t.)g(P)n(opular)f(k)n(eyw)n(ords)g(are)g(an)i
+(easy)e(target)h(since)h(they)f(are)g(b)n(y)g(nature)523
+2244 y(easily)k(guessed.)h(Namespaces)f(can)g(theoretically)h
+(eliminate)g(this)g(problem,)g(ho)n(w)n(ev)n(er)523 2344
+y(they)28 b(create)e(a)h(new)g(di\016cult)n(y)h(in)f(assessing)f(whic)n
+(h)h(pseudon)n(yms)f(represen)n(t)g(users)h(that)523
+2443 y(pro)n(vide)20 b(v)-5 b(aluable)20 b(con)n(ten)n(t.)h(A)g(secure)
+f(reputation)g(system,)h(lik)n(e)f(Adv)n(ogato)f([)p
+0 1 0 TeXcolorrgb 2996 2443 a
 SDict begin H.S end
- 934 2543 a 0 1 0 TeXcolorrgb FA(15)p 0 1 0
-TeXcolorrgb 1017 2489 a
+ 2996 2443 a 0 1 0 TeXcolorrgb
+FA(15)p 0 1 0 TeXcolorrgb 3079 2390 a
 SDict begin H.R end
- 1017 2489 a 1017 2543 a
+ 3079 2390 a 3079
+2443 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.levien03advogato) cvn H.B /ANN pdfmark end
- 1017
-2543 a Black FA(],)h(ma)n(y)g(b)r(e)g(a)g(step)g(to)n(w)n(ards)f(a)h
-(tec)n(hnical)f(solution)h(for)g(this)g(problem.)523
-2643 y(A)c(p)r(ossibly)f(more)g(imp)r(ortan)n(t)g(c)n(hallenge)g(for)g
-(future)h(w)n(ork)e(is)h(making)g(suc)n(h)g(complex)523
-2742 y(solutions)27 b(easily)g(accessible)f(for)h(the)h(a)n(v)n(erage)d
-(user.)523 2911 y
+ 3079 2443 a Black FA(],)i(ma)n(y)g(b)r(e)523 2543
+y(a)k(step)h(to)n(w)n(ards)e(a)i(tec)n(hnical)f(solution)h(for)f(this)h
+(problem.)g(A)g(p)r(ossibly)f(more)g(imp)r(ortan)n(t)523
+2643 y(c)n(hallenge)i(for)h(future)h(w)n(ork)e(is)h(making)g(suc)n(h)g
+(complex)g(solutions)g(easily)f(accessible)h(for)523
+2742 y(the)g(a)n(v)n(erage)d(user.)523 2911 y
 SDict begin H.S end
+ 523 2911
+a 523 2911 a
+SDict begin 12 H.A end
  523 2911 a 523 2911 a
-SDict begin 12 H.A end
- 523 2911 a 523
-2911 a
 SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.5.2) cvn H.B /DEST
 pdfmark end
- 523 2911 a 84 x Fr(5.2)95 b Fi(KBlo)-5 b(cks)32
-b Fr(or)g(triple-hash)523 3166 y FA(The)c(triple-hash)f(that)h(w)n(as)f
-(used)g(instead)h(of)g Ft(KBlo)l(ck)p FA(s)g(in)g(our)f(earlier)g(w)n
-(ork)54 b([)p 0 1 0 TeXcolorrgb 3093 3166 a
+ 523 2911 a 84 x Fr(5.2)95
+b Fi(KBlo)-5 b(cks)32 b Fr(or)g(triple-hash)523 3166
+y FA(The)c(triple-hash)f(that)h(w)n(as)f(used)g(instead)h(of)g
+Ft(KBlo)l(ck)p FA(s)g(in)g(our)f(earlier)g(w)n(ork)54
+b([)p 0 1 0 TeXcolorrgb 3093 3166 a
 SDict begin H.S end
- 3093 3166
-a 0 1 0 TeXcolorrgb FA(2)p 0 1 0 TeXcolorrgb 3134 3112
-a
+ 3093 3166 a 0 1 0
+TeXcolorrgb FA(2)p 0 1 0 TeXcolorrgb 3134 3112 a
 SDict begin H.R end
- 3134 3112 a 3134 3166 a
+ 3134
+3112 a 3134 3166 a
 SDict begin [ /Color [0 1 0] /H /I /Border [0 0 0] /Subtype /Link /Dest
 (cite.esed) cvn H.B /ANN pdfmark end
  3134 3166 a Black FA(])28 b(allo)n(ws)523
@@ -7763,20 +7768,22 @@
 (original)e(sc)n(heme,)i(discuss)f(the)h(attac)n(k)f(and)h(then)g
 (compare)f(it)523 3464 y(with)h(the)g Ft(KBlo)l(ck)h
 FA(approac)n(h)d(tak)n(en)h(in)g(this)h(pap)r(er.)648
-3565 y(Let)37 b(an)h Ft(RBlo)l(ck)g FA(b)r(e)g(a)f(blo)r(c)n(k)g(that)h
-(con)n(tains)f(the)h(metadata)f(of)h(a)f(\014le)h(\(including)523
-3664 y(the)33 b(top)f(CHK)g(data\).)g(The)h(only)f(di\013erence)g(b)r
-(et)n(w)n(een)g Ft(RBlo)l(ck)p FA(s)h(and)f Ft(KBlo)l(ck)p
-FA(s)i(is)e(that)523 3764 y Ft(RBlo)l(ck)p FA(s)d(are)e(enco)r(ded)h
-(and)g(requested)f(using)h(the)g(triple-hash)g(sc)n(heme.)f(F)-7
-b(or)28 b(eac)n(h)f(k)n(ey-)523 3864 y(w)n(ord)k Fq(k)j
-FA(asso)r(ciated)c(with)i(a)g(\014le,)g(the)g Ft(RBlo)l(ck)g
-Fq(R)g FA(of)g(the)g(\014le)g(is)f(encrypted)h(with)g
-Fq(H)7 b FA(\()p Fq(k)s FA(\))523 3963 y(and)29 b(stored)f(under)g
-Fq(H)7 b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\).)30 b(Using)e(the)h(k)n
-(eyw)n(ord)e(as)h(the)h(source)f(for)g(the)h(k)n(ey)f(allo)n(ws)523
-4063 y(the)g(receiv)n(er)e(of)h(the)h(\014le)g(to)g(obtain)f(the)h(k)n
-(ey)f(b)n(y)g(guessing.)648 4163 y(Querying)39 b(for)h(an)g
+3565 y(Let)35 b(an)g Ft(RBlo)l(ck)h FA(b)r(e)g(a)e(new)i(kind)f(of)g
+(blo)r(c)n(k)g(that)g(also)g(con)n(tains)f(the)h(metadata)g(of)523
+3664 y(a)c(\014le)g(\(including)h(the)g(top)f(CHK)g(data\).)g(The)g
+(only)g(di\013erence)g(b)r(et)n(w)n(een)g Ft(RBlo)l(ck)p
+FA(s)h(and)523 3764 y Ft(KBlo)l(ck)p FA(s)c(is)f(that)h
+Ft(RBlo)l(ck)p FA(s)f(are)f(encrypted)h(and)g(requested)g(using)g(the)g
+(follo)n(wing)f(triple-)523 3864 y(hash)35 b(sc)n(heme.)f(F)-7
+b(or)35 b(eac)n(h)f(k)n(eyw)n(ord)g Fq(k)s FA(,)h(the)g
+Ft(RBlo)l(ck)h Fq(R)g FA(is)f(encrypted)g(with)h Fq(H)7
+b FA(\()p Fq(k)s FA(\))35 b(and)523 3963 y(stored)f(as)f(the)i(pair)f
+Fb(f)p Fq(H)7 b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\))p
+Fq(;)14 b(E)1682 3978 y Fh(H)t Fz(\()p Fh(k)q Fz(\))1834
+3963 y FA(\()p Fq(R)q FA(\))p Fb(g)p FA(.)34 b(Using)g(the)h(k)n(eyw)n
+(ord)e(as)g(the)i(source)f(for)523 4063 y(the)28 b(k)n(ey)f(allo)n(ws)f
+(the)i(receiv)n(er)e(of)i(the)g(\014le)f(to)h(obtain)f(the)h(k)n(ey)f
+(b)n(y)g(guessing.)648 4163 y(Querying)39 b(for)h(an)g
 Ft(RBlo)l(ck)h FA(is)f Fr(not)h FA(straigh)n(tforw)n(ard.)c(The)k
 (problem)f(is)g(that)h(the)523 4263 y(in)n(tuitiv)n(e)g(c)n(hoice)e
 (for)h(a)g(query)-7 b(,)40 b Fq(H)7 b FA(\()p Fq(H)g
@@ -7787,29 +7794,29 @@
 FA(\)\),)34 b(the)523 4462 y(initiator)d(sends)g(the)g(so-called)f
 (\\triple-hash")g(query)g Fq(H)7 b FA(\()p Fq(H)g FA(\()p
 Fq(H)g FA(\()p Fq(k)s FA(\)\)\).)32 b(A)g(p)r(eer)f(that)h(has)523
-4562 y(stored)j Fq(E)842 4577 y Fh(H)t Fz(\()p Fh(k)q
-Fz(\))994 4562 y FA(\()p Fq(R)q FA(\))i(under)f Fq(H)7
-b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\))37 b(can)f(matc)n(h)g(the)g
-(query)g(with)g(the)h(resp)r(onse)e(and)523 4662 y(send)27
-b(bac)n(k)e(the)i(pair)f Fq(H)7 b FA(\()p Fq(H)g FA(\()p
-Fq(k)s FA(\)\))p Fq(;)14 b(E)1640 4677 y Fh(H)t Fz(\()p
-Fh(k)q Fz(\))1792 4662 y FA(\()p Fq(R)q FA(\).)27 b(In)n(termediaries)e
-(can)h(v)n(erify)g(that)h(the)g(pro)r(of)p Black 523
-4748 473 4 v 546 4801 a Fy(3)p 0 TeXcolorgray 606 4742
-a
+4562 y(stored)19 b Fq(E)826 4577 y Fh(H)t Fz(\()p Fh(k)q
+Fz(\))978 4562 y FA(\()p Fq(R)q FA(\))h(under)f Fq(H)7
+b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\))21 b(can)e(matc)n(h)g(the)i
+(query)e(with)h(the)g(resp)r(onse)e(and)i(send)523 4662
+y(bac)n(k)27 b(the)h(pair)f Fb(f)p Fq(H)7 b FA(\()p Fq(H)g
+FA(\()p Fq(k)s FA(\)\))p Fq(;)14 b(E)1497 4677 y Fh(H)t
+Fz(\()p Fh(k)q Fz(\))1649 4662 y FA(\()p Fq(R)q FA(\))p
+Fb(g)p FA(.)27 b(In)n(termediaries)g(can)g(v)n(erify)g(that)h(the)g
+(pro)r(of)f(of)p Black 523 4748 473 4 v 546 4801 a Fy(3)p
+0 TeXcolorgray 606 4742 a
 SDict begin H.S end
- 606 4742 a 0 TeXcolorgray 0 TeXcolorgray 606 4742 a
+ 606 4742 a 0 TeXcolorgray 0
+TeXcolorgray 606 4742 a
 SDict begin H.R end
-
-606 4742 a 606 4742 a
+ 606 4742 a 606 4742 a
 SDict begin [ /View [/XYZ H.V] /Dest (Hfootnote.3) cvn H.B /DEST pdfmark
 end
- 606 4742 a Black 91 x Fx(Note)g(that)f(only)g(op)
-r(erations)i(causing)g(global)g(shifts)f(in)g(the)f(data)h(ha)n(v)n(e)f
-(this)h(prop)r(ert)n(y)-6 b(.)25 b(One)606 4924 y(single-c)n(haracter)d
-(replacemen)n(t)g(c)n(hanges)f(only)g(one)g(ro)r(ot-to-leaf)i(path)d
-(in)h(the)g(enco)r(ding)g(tree.)p Black Black Black eop
-end
+ 606 4742
+a Black 91 x Fx(Note)g(that)f(only)g(op)r(erations)i(causing)g(global)g
+(shifts)f(in)g(the)f(data)h(ha)n(v)n(e)f(this)h(prop)r(ert)n(y)-6
+b(.)25 b(One)606 4924 y(single-c)n(haracter)d(replacemen)n(t)g(c)n
+(hanges)f(only)g(one)g(ro)r(ot-to-leaf)i(path)d(in)h(the)g(enco)r(ding)
+g(tree.)p Black Black Black eop end
 %%Page: 17 17
 TeXDict begin 17 16 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop
@@ -7827,104 +7834,101 @@
 end
  523 232 a Black 1036 w Fx(An)25
 b(Enco)r(ding)h(for)h(Censorship-Resistan)n(t)f(Sharing)199
-b(17)p Black 523 448 a FA(of)40 b(authen)n(ticit)n(y)-7
-b(,)41 b Fq(H)7 b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\),)41
-b(hashes)e(to)h(the)h(query)f Fq(H)7 b FA(\()p Fq(H)g
-FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\)\).)41 b(Malicious)e(p)r(eers)523
-548 y(cannot)33 b(construct)f(the)i(pro)r(of)e Fq(H)7
-b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\))34 b(without)f(guessing)f
-Fq(k)k FA(or)c(in)n(v)n(erting)g(the)h(hash)523 648 y(function.)648
-749 y(The)41 b(problem)g(with)h(the)f(triple-hash)g(is)g(that)h(an)f
-(adv)n(ersary)d(that)k(is)f(routing)f(a)523 849 y(resp)r(onse)35
+b(17)p Black 523 448 a FA(authen)n(ticit)n(y)-7 b(,)21
+b Fq(H)7 b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\),)21
+b(hashes)f(to)g(the)h(query)f Fq(H)7 b FA(\()p Fq(H)g
+FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\)\).)22 b(Malicious)d(p)r(eers)h
+(cannot)523 548 y(construct)26 b(the)g(pro)r(of)g Fq(H)7
+b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\))26 b(without)h(guessing)e
+Fq(k)k FA(or)c(in)n(v)n(erting)g(the)i(hash)e(function.)648
+648 y(The)41 b(problem)g(with)h(the)f(triple-hash)g(is)g(that)h(an)f
+(adv)n(ersary)d(that)k(is)f(routing)f(a)523 747 y(resp)r(onse)35
 b(to)h(a)g(triple-hash)f(request)h(can)g(substitute)h(the)f(encrypted)g
-(con)n(ten)n(t)g(in)h(the)523 948 y Fb(f)p Fq(H)7 b FA(\()p
-Fq(H)g FA(\()p Fq(K)f FA(\)\))p Fq(;)14 b(E)1020 963
-y Fh(H)t Fz(\()p Fh(K)t Fz(\))1195 948 y FA(\()p Fq(Q;)g(K)q(;)g(siz)t
-(e)p FA(\))p Fb(g)k FA(resp)r(onse)h(while)i(main)n(taining)e(the)i
-Fq(H)7 b FA(\()p Fq(H)g FA(\()p Fq(K)f FA(\)\))21 b(tok)n(en.)523
-1048 y(The)26 b(resulting)g(reply)f Fb(f)p Fq(H)7 b FA(\()p
-Fq(H)g FA(\()p Fq(K)f FA(\)\))p Fq(;)14 b(X)7 b Fb(g)24
-b FA(still)j(lo)r(oks)e(lik)n(e)g(a)h(v)-5 b(alid)26
-b(resp)r(onse)f(to)h(the)g(triple-)523 1148 y(hash)i(query)f
-Fq(H)7 b FA(\()p Fq(H)g FA(\()p Fq(H)g FA(\()p Fq(K)f
-FA(\)\)\).)28 b(The)g(triple-hash)f(th)n(us)h(do)r(es)g(not)g(protect)f
-(against)g(suc)n(h)g(a)523 1247 y(substitution)34 b(attac)n(k)e(b)n(y)h
-(an)g(in)n(termediary)-7 b(.)32 b(The)i(impact)f(of)h(the)f(attac)n(k)g
-(is)g(suc)n(h)g(that)523 1347 y(the)c(net)n(w)n(ork)f(w)n(ould)g
-(propagate)f(and)h(cac)n(he)g(the)h(in)n(v)-5 b(alid)29
-b(replies.)f(The)h(attac)n(k)f(will)h(not)523 1447 y(prev)n(en)n(t)39
-b(the)i(spread)e(of)i(v)-5 b(alid)40 b(replies)f(through)h(other)g
-(routes)f(in)i(the)f(system)g(since)523 1546 y(m)n(ultiple)25
-b(results)f(to)g(the)g(same)g(query)f(are)h(p)r(ossible.)g(F)-7
-b(urthermore,)23 b(an)n(y)g(user)h(searc)n(hing)523 1646
-y(for)i Fq(K)32 b FA(will)27 b(not)f(see)h(the)f(in)n(v)-5
-b(alid)27 b(results.)f(The)h(reason)e(is)h(that)h(the)g(attempt)g(to)f
-(decrypt)523 1745 y Fq(X)34 b FA(with)29 b Fq(H)7 b FA(\()p
-Fq(K)f FA(\))28 b(will)g(\(with)h(high)e(probabilit)n(y\))h(result)f
-(in)h(a)g(malformed)f Ft(RBlo)l(ck)p FA(.)i(Th)n(us,)523
-1845 y(the)21 b(end-user)f(is)h(still)g(protected)f(from)h(this)g(t)n
+(con)n(ten)n(t)g(in)h(the)523 847 y Fb(f)p Fq(H)7 b FA(\()p
+Fq(H)g FA(\()p Fq(k)s FA(\)\))p Fq(;)14 b(E)989 862 y
+Fh(H)t Fz(\()p Fh(k)q Fz(\))1141 847 y FA(\()p Fq(C)6
+b(H)h(K)q(;)14 b(siz)t(e)p FA(\))p Fb(g)26 b FA(resp)r(onse)h(while)h
+(main)n(taining)g(the)g Fq(H)7 b FA(\()p Fq(H)g FA(\()p
+Fq(k)s FA(\)\))29 b(tok)n(en.)523 946 y(The)g(resulting)f(reply)g
+Fb(f)p Fq(H)7 b FA(\()p Fq(H)g FA(\()p Fq(k)s FA(\)\))p
+Fq(;)14 b(X)7 b Fb(g)27 b FA(still)i(lo)r(oks)e(lik)n(e)i(a)f(v)-5
+b(alid)28 b(resp)r(onse)g(to)g(the)h(triple-)523 1046
+y(hash)h(query)g Fq(H)7 b FA(\()p Fq(H)g FA(\()p Fq(H)g
+FA(\()p Fq(k)s FA(\)\)\).)32 b(The)f(triple-hash)f(th)n(us)g(do)r(es)h
+(not)f(protect)h(against)e(suc)n(h)h(a)523 1146 y(substitution)22
+b(attac)n(k)f(b)n(y)h(an)g(in)n(termediary)-7 b(.)20
+b(The)i(impact)g(of)g(the)g(attac)n(k)f(is)h(suc)n(h)f(that)i(the)523
+1245 y(net)n(w)n(ork)i(w)n(ould)h(propagate)e(and)i(p)r(ossibly)g(cac)n
+(he)f(the)i(in)n(v)-5 b(alid)26 b(replies.)g(The)g(attac)n(k)g(will)523
+1345 y(not)i(prev)n(en)n(t)f(the)h(spread)f(of)h(v)-5
+b(alid)28 b(replies)f(through)h(other)f(routes)g(in)h(the)h(system)e
+(since)523 1445 y(m)n(ultiple)e(results)f(to)g(the)g(same)g(query)f
+(are)h(p)r(ossible.)g(F)-7 b(urthermore,)23 b(an)n(y)g(user)h(searc)n
+(hing)523 1544 y(for)i Fq(K)32 b FA(will)27 b(not)f(see)h(the)f(in)n(v)
+-5 b(alid)27 b(results.)f(The)h(reason)e(is)h(that)h(the)g(attempt)g
+(to)f(decrypt)523 1644 y Fq(X)34 b FA(with)29 b Fq(H)7
+b FA(\()p Fq(K)f FA(\))28 b(will)g(\(with)h(high)e(probabilit)n(y\))h
+(result)f(in)h(a)g(malformed)f Ft(RBlo)l(ck)p FA(.)i(Th)n(us,)523
+1743 y(the)21 b(end-user)f(is)h(still)g(protected)f(from)h(this)g(t)n
 (yp)r(e)g(of)f(spam.)h(Nev)n(ertheless,)f(the)h(adv)n(ersary)523
-1945 y(can)27 b(abuse)g(net)n(w)n(ork)f(resources)g(for)h(transmitting)
-g(and)h(cac)n(hing)e Fq(X)7 b FA(.)648 2046 y(Replacing)26
-b(the)h(triple-hash)g(with)g Ft(KBlo)l(ck)p FA(s)h(for)f(ECRS)f(comes)h
-(at)g(a)f(relativ)n(ely)g(high)523 2146 y(price.)42 b(Where)g(the)g
-(trip)r(e-hash)g(only)f(requires)g(a)h(simple)g(hash)g(op)r(eration)f
-(to)h(v)n(erify)523 2246 y(replies,)30 b Ft(KBlo)l(ck)p
-FA(s)h(need)f(to)g(p)r(erform)g(a)g(public)g(k)n(ey)g(op)r(eration.)f
-(W)-7 b(orse,)30 b(when)g(publish-)523 2345 y(ing)d(con)n(ten)n(t)f(or)
-g(searc)n(hing,)f(the)j(triple-hash)e(sc)n(heme)g(again)g(only)g
-(requires)g(a)g(few)i(quic)n(k)523 2445 y(hash)33 b(op)r(erations)e(to)
-i(compute)h(the)f(query)g(or)f(the)h(con)n(ten)n(t.)g(With)h
-Ft(KBlo)l(ck)p FA(s,)g(the)f(cost)523 2544 y(increases)h(to)h
-(additionally)f(generating)g(a)g(public-priv)-5 b(ate)35
-b(k)n(ey)g(pair)f(in)h(addition)g(to)g(a)523 2644 y(public)28
-b(k)n(ey)f(op)r(eration)g(and)g(hash)g(op)r(erations.)648
-2746 y(Both)42 b Ft(KBlo)l(cks)h FA(and)f(the)h(triple-hash)e(are)h
-(vulnerable)f(to)h(the)h(guessing)e(attac)n(k.)523 2845
+1843 y(can)29 b(abuse)g(net)n(w)n(ork)f(resources)f(in)i(the)h(form)f
+(of)g(transmission)f(and)i(cac)n(hing)e(of)h(in)n(v)-5
+b(alid)523 1943 y(data.)648 2042 y(Replacing)26 b(the)h(triple-hash)g
+(with)g Ft(KBlo)l(ck)p FA(s)h(for)f(ECRS)f(comes)h(at)g(a)f(relativ)n
+(ely)g(high)523 2142 y(price.)42 b(Where)g(the)g(trip)r(e-hash)g(only)f
+(requires)g(a)h(simple)g(hash)g(op)r(eration)f(to)h(v)n(erify)523
+2242 y(replies,)30 b Ft(KBlo)l(ck)p FA(s)h(need)f(to)g(p)r(erform)g(a)g
+(public)g(k)n(ey)g(op)r(eration.)f(W)-7 b(orse,)30 b(when)g(publish-)
+523 2341 y(ing)d(con)n(ten)n(t)f(or)g(searc)n(hing,)f(the)j
+(triple-hash)e(sc)n(heme)g(again)g(only)g(requires)g(a)g(few)i(quic)n
+(k)523 2441 y(hash)33 b(op)r(erations)e(to)i(compute)h(the)f(query)g
+(or)f(the)h(con)n(ten)n(t.)g(With)h Ft(KBlo)l(ck)p FA(s,)g(the)f(cost)
+523 2540 y(increases)h(to)h(additionally)f(generating)g(a)g
+(public-priv)-5 b(ate)35 b(k)n(ey)g(pair)f(in)h(addition)g(to)g(a)523
+2640 y(public)28 b(k)n(ey)f(op)r(eration)g(and)g(hash)g(op)r(erations.)
+648 2740 y(Both)42 b Ft(KBlo)l(cks)h FA(and)f(the)h(triple-hash)e(are)h
+(vulnerable)f(to)h(the)h(guessing)e(attac)n(k.)523 2839
 y(Guessing)d(is)h(sligh)n(tly)f(easier)f(for)h(the)h(triple-hash)f
-(since)g(the)h(computation)g(for)f(eac)n(h)523 2945 y(guess)21
+(since)g(the)h(computation)g(for)f(eac)n(h)523 2939 y(guess)21
 b(is)h(m)n(uc)n(h)f(c)n(heap)r(er.)g(Ov)n(erall,)f Ft(KBlo)l(cks)j
 FA(w)n(ork)e(b)r(etter)h(than)g(the)g(triple-hash)f(against)523
-3045 y(adv)n(ersaries)f(that)j(indiscriminately)g(attempt)h(to)e(abuse)
-h(net)n(w)n(ork)e(resources,)g(but)j(at)f(the)523 3144
+3039 y(adv)n(ersaries)f(that)j(indiscriminately)g(attempt)h(to)e(abuse)
+h(net)n(w)n(ork)e(resources,)g(but)j(at)f(the)523 3138
 y(exp)r(ense)28 b(of)f(higher)g(CPU)h(utilization)f(ev)n(en)g(in)h(the)
 g(absence)f(of)h(an)f(attac)n(k.)g(Th)n(us)g(using)523
-3244 y(the)36 b(triple-hash)e(sc)n(heme)g(ma)n(y)h(still)g(b)r(e)h
+3238 y(the)36 b(triple-hash)e(sc)n(heme)g(ma)n(y)h(still)g(b)r(e)h
 (reasonable)d(in)i(net)n(w)n(orks)f(with)h(limited)h(CPU)523
-3343 y(p)r(o)n(w)n(er)26 b(or)h(less)g(stringen)n(t)g(securit)n(y)g
-(requiremen)n(ts.)523 3517 y
+3337 y(p)r(o)n(w)n(er)26 b(or)h(less)g(stringen)n(t)g(securit)n(y)g
+(requiremen)n(ts.)523 3503 y
 SDict begin H.S end
- 523 3517 a 523 3517 a
+ 523 3503 a 523 3503 a
 SDict begin 12 H.A end
  523
-3517 a 523 3517 a
+3503 a 523 3503 a
 SDict begin [ /View [/XYZ H.V] /Dest (section.1.6) cvn H.B /DEST pdfmark
 end
- 523 3517 a 102 x Fu(6)112 b(Conclusion)523
-3828 y FA(This)24 b(pap)r(er)g(has)g(describ)r(ed)h(an)f(enco)r(ding)g
-(sc)n(heme)g(whic)n(h)g(is)g(able)g(to)h(pro)r(duce)f(the)h(same)523
-3928 y(ciphertext)f(\(with)h(the)f(exception)g(of)g(one)f(small)h
-Ft(KBlo)l(ck)h FA(p)r(er)f(k)n(eyw)n(ord\))e(for)i(the)g(encryp-)523
-4028 y(tion)36 b(of)h(a)f(\014le)g(indep)r(enden)n(t)i(of)e(the)h(k)n
-(ey\(w)n(ords\))e(c)n(hosen)g(b)n(y)h(the)h(con)n(ten)n(t)f(pro)n
-(viders.)523 4127 y(The)27 b(resulting)f(ciphertext)g(is)g(not)h
-(signi\014can)n(tly)f(larger)e(than)j(the)g(plain)n(text.)f(Arbitrary)
-523 4227 y(pieces)36 b(of)g(the)h(ciphertext)f(can)g(b)r(e)g(generated)
-f(from)h(plain)n(text)g(without)h(reading)e(un-)523 4327
-y(related)h(parts)g(of)g(the)h(plain)n(text.)g(The)f(enco)r(ding)h(mec)
-n(hanism)f(mak)n(es)f(it)i(di\016cult)h(for)523 4426
-y(censors)d(to)g(selectiv)n(ely)h(suppress)f(con)n(ten)n(t.)h(While)g
-(dictionary)f(attac)n(ks)g(on)h(the)g(pass-)523 4526
-y(w)n(ord)29 b(and)h(kno)n(wn)f(plain)n(text)h(attac)n(ks)f(on)g(the)i
-(ciphertext)f(are)f(still)h(p)r(ossible,)g(they)g(are)523
-4625 y(harmless)36 b(with)h(resp)r(ect)g(to)f(the)i(goal)d(of)i
-(deniabilit)n(y)g(for)f(in)n(termediaries.)g(The)h(basic)523
-4725 y(enco)r(ding)28 b(sc)n(heme)g(can)f(b)r(e)i(extended)f(with)h
-(directories)e(and)h(namespaces)f(whic)n(h)h(allo)n(w)523
-4825 y(for)23 b(restricting)f(searc)n(hes)f(to)i(con)n(ten)n(t)g
-(published)g(b)n(y)g(kno)n(wn)g(pseudon)n(yms.)f(Namespaces)523
-4924 y(allo)n(w)27 b(for)g(\014les)g(and)h(directories)e(to)h(b)r(e)h
-(up)r(dated.)p Black Black eop end
+ 523 3503 a 100 x Fu(6)112 b(Conclusion)523
+3802 y FA(This)26 b(pap)r(er)g(has)f(describ)r(ed)h(an)g(enco)r(ding)g
+(sc)n(heme)f(whic)n(h)h(hides)g(the)h(shared)e(data)g(from)523
+3902 y(in)n(termediaries.)k(The)h(enco)r(ding)g(uses)g(con)n(v)n(ergen)
+n(t)e(encryption,)i(allo)n(ws)f(sw)n(arming)f(and)523
+4002 y(pro)r(duces)34 b(a)g(ciphertext)h(that)g(is)f(not)h
+(signi\014can)n(tly)f(larger)f(than)h(the)h(plain)n(text.)g(Indi-)523
+4101 y(vidual)26 b(blo)r(c)n(ks)e(of)i(the)g(ciphertext)g(can)f(b)r(e)h
+(generated)f(from)g(plain)n(text)h(without)g(reading)523
+4201 y(unrelated)38 b(parts)h(of)f(the)h(original.)f(While)h
+(dictionary)f(attac)n(ks)g(on)g(the)h(k)n(eyw)n(ords)e(or)523
+4301 y(kno)n(wn)24 b(plain)n(text)g(attac)n(ks)g(on)g(the)h(con)n(ten)n
+(t)f(are)g(still)h(p)r(ossible,)f(they)h(are)e(harmless)g(with)523
+4400 y(resp)r(ect)k(to)h(the)g(goal)e(of)i(deniabilit)n(y)g(for)f(in)n
+(termediaries.)f(The)i(basic)f(enco)r(ding)g(sc)n(heme)523
+4500 y(can)21 b(b)r(e)h(extended)g(with)g(directories)e(and)i
+(namespaces.)e(Namespaces)g(allo)n(w)h(for)g(\014les)g(and)523
+4599 y(directories)28 b(to)i(b)r(e)g(up)r(dated.)g(Using)g
+Fq(k)s FA(-deterministic)f(public-priv)-5 b(ate)30 b(k)n(eys)f(for)g
+(signing)523 4699 y(con)n(ten)n(t)e(it)h(is)g(p)r(ossible)f(to)g(v)n
+(erify)g(searc)n(h)f(results)h(in)h(a)f(global)g(k)n(eyw)n(ord)f
+(space.)p Black Black eop end
 %%Page: 18 18
 TeXDict begin 18 17 bop 0 0 a
 SDict begin /product where{pop product(Distiller)search{pop pop pop

Modified: GNUnet-docs/papers/ecrs/main.tex
===================================================================
--- GNUnet-docs/papers/ecrs/main.tex    2005-06-02 05:39:28 UTC (rev 842)
+++ GNUnet-docs/papers/ecrs/main.tex    2005-06-02 15:05:35 UTC (rev 843)
@@ -33,7 +33,7 @@
  address@hidden 
 \and
   CERIAS / Interdepartmental Program in Linguistics, Purdue University, USA \\
- address@hidden 
+ address@hidden 
 \and
   Motorola Labs, USA \\
  address@hidden 
@@ -80,9 +80,9 @@
 decentralized}, open wide area network where many {\em untrusted}
 peers want to share data.  The proposed encoding scheme, called ECRS,
 allows both content and queries to be encrypted while being
-transmitted or stored on the network.  This ensures that servers as
-well as all intermediate peers are oblivious of the data they are
-actually handling, reducing the chance that they can be singled out
+transmitted or stored on the network.  This ensures that 
+intermediaries are oblivious of the data they are
+handling, reducing the chance that they can be singled out
 for an attack or held liable.  It is important to note that the
 primary goal is {\em deniability} for the peers storing and
 transmitting the information.  These peers must be able to claim that
@@ -126,7 +126,7 @@
 participants.
 
 The encoding mechanism must ensure that invalid replies are detected
-and that peers can {\em distinguish} valuable content from maliciously
+and that peers can distinguish valuable content from maliciously
 generated noise.  This is particularly important in three cases.
 First, if large files are assembled using blocks from multiple peers,
 some of these peers may be malicious and try to corrupt the file.
@@ -135,13 +135,13 @@
 should be difficult for peers to spam the result set.  Otherwise the
 users may drown in useless information.  Finally, intermediaries and
 that are merely routing the content should be able to detect invalid
-replies.  This enables local economies (like~\cite{ebe2003}) and
+replies.  This enables local economies (like in~\cite{ebe2003}) and
 prevents the retransmission and replication of corrupted data by
 non-malicious peers.
 
 % now some meat
 ECRS uses two fundamental primitives in the overall encoding scheme.
-The majority of the content in the network uses a variant of Freenet's
+The majority of the data is encrypted with a variant of Freenet's
 CHK encoding~\cite{clark99distributed}.  CHK stands for Content Hash
 Key; in other words, the content is encrypted with a key that is
 derived from a cryptographic hash of the plaintext.  The encrypted
@@ -154,15 +154,16 @@
 Instead, files are split into fixed-size blocks which could then be
 individually distributed (and replicated) across peers in the network.
 This is a natural way to balance the load and to enable swarming.  The
-blocks can be individually identified by a query, encrypted, decrypted
-and verified.  Verification of an encrypted block is accomplished by
-checking that it matches a given query.  This verification only
-requires the encrypted block and the query; it does not reveal the key
-required to decrypt the block.  ECRS guarantees that it is hard to
-forge a response that passes verification for a given query.
-Splitting files into blocks allows ECRS to detect data corruption on
-the block level.  Malicious peers cannot transmit more than the
-selected block size of invalid data before being detected.
+blocks can be individually identified, encrypted, decrypted and
+verified.  Each block is identified by one or two hash codes.  The
+blocks are encrypted using a key that is independent of the hashes
+used for identification.  Finally, verification only requires the
+encrypted block and the query; it does not reveal the key required to
+decrypt the block.  ECRS guarantees that it is hard to forge a
+response that passes verification for a given query.  Splitting files
+into blocks allows ECRS to detect data corruption on the block level.
+Malicious peers cannot transmit more than the selected block size of
+invalid data before being detected.
 
 The second primitive used by ECRS, the {\em KBlock}, is completely
 novel.  {\em KBlock}s allow users to securely obtain the key-query
@@ -172,26 +173,25 @@
 attacked successfully by a non-guessing intermediary.  This is
 achieved using signatures from deterministically generated public keys
 to sign content advertisements.  Using {\em KBlock}s, documents can be
-inserted under multiple keys at a minimal cost in space.  Users can
-perform boolean searches of the form {\tt a AND b} which then return
-the documents which were inserted under a matching set of keywords.
-Before the download, the user can refine the search results using the
-metadata associated with the file.
+inserted under multiple keys at a minimal cost in terms of space.
+Users can perform boolean searches of the form {\tt a AND b} which
+then return the documents which were inserted under a matching set of
+keywords.  Before the download, the user can refine the search results
+using the metadata associated with the file.
 
 % organization
 The rest of the paper is organized as follows.  Section~\ref{related}
 contrasts the current work with mechanisms used in other
 censorship-resistant systems.  Section~\ref{content} describes the
 ECRS encoding scheme in detail.  Section~\ref{extensions} lists some
-extensions to the basic scheme.  Finally, section~\ref{discussion}
+extensions to the basic scheme.  Finally, Section~\ref{discussion}
 discusses attacks on ECRS and contrasts it to previous work.
 
 % previous version
 This work builds on our earlier paper~\cite{esed} which was first
 published at ACISP 2001.  Since then, the encoding scheme has been
-revised to address additional requirements, to improve the security in
-various aspects and to meet issues related to a better implementation.
-This paper reflects these changes.
+revised to address additional requirements an to improve the security
+in various aspects.  This paper reflects these changes.
 
 
 
@@ -199,7 +199,7 @@
 
 A large number of censorship-resistant (or at least
 fault-tolerant) publishing systems have been proposed in recent years
-\cite{anderson96eternity,clark99distributed,chen99prototype,freehaven-berk,feamster-infranet,herlihy87how,waldman2001tangler,pub00}.
+\cite{anderson96eternity,chen99prototype,clark99distributed,freehaven-berk,feamster-infranet,herlihy87how,waldman2001tangler,pub00}.
 The proposed protocols differ in various aspects unrelated to the
 specifics of the encoding mechanism, such as content replication and the use of
 anonymous or steganographic communication.  Characteristic of all of
@@ -226,7 +226,7 @@
 first.  Thus, if a node operator wishes to keep content directly
 accessible on the host, a local copy of the plaintext must be kept in
 addition to the encrypted content in the Freenet database.  Also,
-Freenet does not support swarming.  One reason certainly is that
+Freenet does not support swarming.  One reason for this is that
 Freenet's CHK encoding can only verify a file in its entirety and not
 pin-point corruptions on a smaller scale.
 
@@ -260,10 +260,9 @@
 numbers as parts of keywords in signed namespaces.  The disadvantage
 of keyservers is that they must be maintained if the indexed keys are
 to be kept up-to-date.  Freenet does not seem to use any encryption
-for the data stored in KSK or SKS keys and therefore fails to
-prevent intermediaries from learning the CHK keys (and for KSKs even
-tampering with the CHK keys), making censorship by intermediaries
-easier.
+for the data stored in KSK or SKS keys and therefore fails to prevent
+intermediaries from learning the CHK keys, making censorship by
+intermediaries easier.
 
 
 \subsection{Free Haven}
@@ -273,9 +272,10 @@
 $n$ shares are sufficient to reconstruct the entire
 document~\cite{rabin89efficient}. To retrieve a document, the user
 must obtain the key that was used to sign the document from some
-source outside the Free Haven network, the design itself does not
-discuss any search functionality.  The user then forwards the key to
-the server which encrypts and sends its share of the document.
+source outside the Free Haven network.  The design of Free Haven
+itself does not discuss any search functionality.  The user then
+forwards the key to the server which encrypts and sends its share of
+the document.
 
 Shares are encoded with an information dispersal algorithm (IDA).
 Hosts are still able to exercise editorial control over the content
@@ -287,15 +287,15 @@
 
 \subsection{Mnet and Mojo Nation}
 
-Mnet is the successor of Mojo Nation~\cite{mojotech}, a
-peer-to-peer network that was the first to focus on using economic
-incentives when trading content.  As the descendant of a commercial
-product, Mnet focuses mostly on efficiency and reliability.
-Nevertheless, Mnet encrypts files with AES using a user-supplied key
-seed to allow for privacy.  The file is then broken into shares using
-an erasure code.  Multiple shares are identified with an SHA-1 hash
-and stored in an inode.  The file can be retrieved using the hash of
-the inode and the symmetric encryption key.
+Mnet is the successor of Mojo Nation~\cite{mojotech}, a peer-to-peer
+network that was the first to focus on using economic incentives when
+trading content.  As the descendant of a commercial product, Mnet
+focuses mostly on efficiency and reliability.  Nevertheless, Mnet
+encrypts files with AES using a user-supplied key to allow for
+privacy.  The file is then broken into shares using an erasure code.
+Multiple shares are identified with an SHA-1 hash and stored in an
+inode.  The file can be retrieved using the hash of the inode and the
+symmetric encryption key.
 
 The use of whole-file AES encryption and the use of an erasure code
 forces Mnet, just like Freenet, to store a second copy of the entire
@@ -315,7 +315,7 @@
 algorithm~\cite{shamir} to split the key required to restore stored
 files between the available servers.  The encrypted file is then
 stored on all servers.  The servers cannot decrypt the file as the key
-is never entirely revealed to them.
+is never revealed to them.
 
 Publius keys are random strings.  The system does not provide any
 search mechanism and expects the users to obtain the keys from an
@@ -339,17 +339,17 @@
 system after the censorship operation.
 
 Tangler has some similarities with ECRS.  In particular, it uses hash
-trees for integrity checks on fixed-size blocks of data.  The major
-difference with ECRS is that the Tangler encoding uses Shamir's secret
+trees for integrity checks on fixed-size blocks of data.  A difference
+with ECRS is that the Tangler encoding uses Shamir's secret
 sharing~\cite{shamir} to entangle the block with other, pre-existing
-blocks, preferably from other documents.  Another similarity between
-Tangler and ECRS is the existence of cryptographically signed data,
+blocks, preferably from other documents.  similarity between Tangler,
+Freenet and ECRS is the existence of cryptographically signed data,
 which Tangler calls collections.  Tangler's collections are analogous
 to directories and namespaces in ECRS.  The major difference is that
-in Tangler, a collection has a versioned root which explicitly lists
+in Tangler a collection has a versioned root which explicitly lists
 all of the contents in the collection, resulting in one of Tangler's
-global synchronization problems.  Placing a document in an ECRS
-namespace only requires that it be adequately signed.
+global synchronization problems.  Placing a document in a Freenet
+subspace or ECRS namespace only requires that it be adequately signed.
 
 
 \subsection{Gnutella and FastTrack} % what does DirectConnect do?
@@ -378,23 +378,22 @@
 peers can then use this information to download the file from multiple
 sources (swarming).  The problem with this approach is that the SHA-1
 hash codes can only be verified once the entire file has been
-retrieved.  To ruin a download, it would suffice for a malicious peer
-to provide just one single invalid block.  The presence of the invalid
+retrieved.  To ruin a download, it suffices for a malicious peer
+to contribute just one single invalid block.  The presence of an invalid
 block could only be detected after the entire file was retrieved.
 Worse, the simplistic SHA-1 approach does not give peers any way to
-identify the invalid block or the malicious peer.
+identify the location of the invalid block or the malicious peer.
 
-Because FastTrack and Gnutella use neither file encryption nor
-anonymous routing to hide the address of either the receiver or the
-sender, they do not technically provide any protection from
-censorship beyond decentralized routing of requests.
+FastTrack and Gnutella do not use neither file encryption.
+Consequently they do not provide any protection from censorship beyond
+decentralized routing of requests.
 
 
 \subsection{Distributed File Systems}
 
 Various distributed file systems based on a peer-to-peer
 infrastructure have been built in recent
-years~\cite{cfs:sosp01,mazieres02building,mazires00sfs,muthitacharoen02ivy,rowstron01storage}.
+years~\cite{cfs:sosp01,mazires00sfs,mazieres02building,muthitacharoen02ivy,rowstron01storage}.
 These systems typically do not focus on censorship-resistance and
 consequently do not encrypt the contents.  Modern systems
 like~\cite{cfs:sosp01,rowstron01storage} route content using
@@ -402,12 +401,12 @@
 achieve $O(\log n)$ scalability.  Writable distributed file systems
 typically require users to authenticate themselves before being
 granted access to the system by one of the
-servers~\cite{mazires00sfs}.  This work focuses on encrypting shared
-data while allowing peers to verify the integrity of the encrypted
-data that they are routing.  In~\cite{mazieres02building} a similar
+servers~\cite{mazires00sfs}.  ECRS focuses on encrypting shared data
+while allowing peers to verify the integrity of the encrypted data
+that they are routing.  In SUNDR~\cite{mazieres02building} a similar
 problem is addressed; here users can detect tampering by the
 (untrusted) server that is storing the data in a setting where
-multiple users are updating the same data.  This work achieves what is
+multiple users are updating the same data.  SUNDR achieves what is
 called {\em fork consistency}, a guarantee that if the server passes a
 version that lacks the changes of one client to another client at one
 point in time, it can never again make the changes of either client
@@ -416,9 +415,8 @@
 strongest possible property that can be achieved given the security
 model used.  ECRS does not allow users with distinct pseudonyms to
 update the same content without essentially creating two files.  This
-allows ECRS to guarantee that peers can never return an {\em
-invalid} result since every copy can be uniquely identified at all
-times.
+allows ECRS to guarantee that peers can never return an {\em invalid}
+result since every copy can be uniquely identified at all times.
 
 
 \section{ECRS encoding} \label{content}
@@ -446,25 +444,23 @@
 Naturally the encoding should not significantly increase the amount of
 data that needs to be transferred.
 
-The ECRS encoding scheme addresses these requirements.  ECRS
-provides plausible deniability by hiding the nature of the queries and
-responses from intermediaries through encryption.
-
-Despite the fact that queries
-and responses are encrypted, intermediaries can {\em verify} that the
-responses are valid with respect to a particular query.  Thus, the
-encoding mechanism provides robustness against tampering and false
-replies.  Additional robustness is gained in ECRS by splitting files
-into small pieces that can be {\em independently} verified, stored and
-distributed across the network.  This makes it easy for protocols
-using ECRS to incorporate features such as swarm
-distribution~\cite{hartman99swarm}, fine-grained load balancing and
+The ECRS encoding scheme addresses these requirements.  ECRS provides
+plausible deniability by hiding the nature of the queries and
+responses from intermediaries through encryption.  Despite the fact
+that queries and responses are encrypted, intermediaries can {\em
+verify} that the responses are valid with respect to a particular
+query.  Thus, the encoding mechanism provides robustness against
+tampering and false replies.  Additional robustness is gained in ECRS
+by splitting files into blocks that can be {\em independently}
+verified, stored and distributed across the network.  This makes it
+easy for protocols using ECRS to incorporate features such as swarm
+distribution~\cite{hartman99swarm}, load balancing and
 microeconomics~\cite{ebe2003}.  These features are also significant
 from the viewpoint of scalability.  When all handled blocks are small,
 nodes can participate in the network activity even if their own
 resources are limited.  Also, storing small, individually
 unintelligible pieces of potentially objectionable content is likely
-to further support plausible deniability.  
+to further support plausible deniability.
 
 
 The rest of this Section gives a bottom-up description of ECRS.  After
@@ -476,8 +472,8 @@
 how ECRS enables users to search for content without exposing the
 (plaintext) query or the corresponding content and how intermediaries
 can verify that a given encrypted reply matches the encrypted query.
-Finally, the core of ECRS is summarized in the form of an algorithm
-and a protocol example.
+Finally, the core of ECRS is summarized in the form of the encoding
+algorithm and a protocol example.
 
 \begin{figure*}[t]
 \begin{center}
@@ -500,7 +496,7 @@
 
 \subsection{Overview} 
 
-In ECRS, the encoded representation of a file is a collection of small
+In ECRS, the encoded representation of a file is a collection of
 blocks.  There are four types of blocks: {\em DBlocks}, {\em IBlocks},
 {\em SBlocks} and {\em KBlocks}.  The maximum size of all blocks in
 ECRS is supposed to be fixed by some small number, for example 32k.
@@ -523,7 +519,7 @@
 Every {\em DBlock} corresponds to 32k of the original file (the last
 block may be padded with zeros).  {\em DBlock}s are encrypted using a
 symmetric cipher.  The key for the cipher for the {\em DBlock}
-corresponding to the plaintext $B_i$ is $K_i := H(B_i)$.  This
+that corresponds to the plaintext $B_i$ is $K_i := H(B_i)$.  This
 guarantees that the same block will always be encrypted with the same
 key.  Also, the integrity of the decrypted block can be verified by
 checking that $K_i = H(B_i)$.  The encrypted block $E_{K_i}(B_i)$ can
@@ -565,14 +561,15 @@
 plaintext under certain keywords (as done in Freenet with KSK keys)
 has various drawbacks.  First, intermediaries would learn about the
 CHK keys that they are storing or transmitting, which may allow them
-to easily censor search results.  Second, the keywords are exposed to
-the intermediaries, which again would facilitate censorship.  Finally,
-peers would be able to send invalid replies that refer to inappropriate
-content.  This may be just a nuisance if malicious peers use this for
-advertising (this kind of behavior can be observed on gnutella from
-time to time).  However, if a network wants to economically reward
-peers for returning search results the possibility of returning
-arbitrary nonsense would make such incentive schemes impractical.
+to easily censor search results.  Second, the keywords are directly
+exposed to the intermediaries, which again would facilitate
+censorship.  Finally, peers would be able to send invalid replies that
+refer to inappropriate content.  This may be just a nuisance if
+malicious peers use this for advertising (this kind of behavior can be
+observed on gnutella from time to time).  Possibly worse, if a network
+wants to economically reward peers for returning search results, the
+possibility of returning arbitrary nonsense might make such incentive
+schemes impractical.
 
 But how can a system prevent peers from returning invalid responses to
 a search?  Since the nature of a search is that the initiator does not
@@ -581,7 +578,7 @@
 cannot be applied to the search problem.  Instead, ECRS must trust the
 user who is uploading the content.  That user must specify appropriate
 keywords and metadata that properly describes the content.  Clearly
-this trust maybe misplaced.  Namespaces are a solution to this problem
+this trust maybe misplaced.  Namespaces can help solve this problem
 since they enable users to learn which other users are trustworthy.
 
 
@@ -636,7 +633,7 @@
 owner of the namespace can decide to publish updates to a particular
 file at a later time.  Since the private key used for signing is owned
 by a single entity, consistency issues from parallel updates do not
-arise.  ECRS does not prevent the owner of the namespace to publish
+arise.  ECRS does not prevent the owner of the namespace from publishing
 conflicting updates.
 
 It should be recognized that the same file can be part of multiple
@@ -645,7 +642,7 @@
 DBlocks} of the file do not need to be changed when the namespace
 or namespace identifier changes.
 
-However, namespaces cannot completely solve the search problem.  Most
+Namespaces cannot completely solve the search problem.  Most
 importantly, users would still have to find the namespaces themselves,
 and while it can be assumed that users can guess keywords, they are
 unlikely to be able to guess public keys for a namespace search.  ECRS
@@ -656,46 +653,47 @@
 other inappropriate data.  However, it is assumed that in that case
 users will use keywords that are more difficult to guess or only use
 the global keyword space to discover trustworthy namespaces -- thus
-avoiding the spam most of the time.  
+avoiding the spam most of the time.
 
 
 \subsection{Keyword search} \label{kblocks}
 
-This section describes how the CHK keys that are necessary to retrieve
-a file can be obtained by searching using natural language {\em
-keywords} -- without reveiling the keywords to intermediaries.
-Searching requires the content provider to supply metadata about the
-file, in particular a list of keywords.  It is assumed that the user
-searching for data is able to {\em guess} at least one of these
-keywords.  The nature of the search implies that there is no direct,
-cryptographically verifiable relation between the keyword and the
-content.  Many files can match a given keyword, and different users
-may even sometimes have a different perception of what is a correct
-semantic match.  Thus a keyword search always has the potential of
-resulting in search results that a user may find inappropriate.  It is
-also not possible to prevent a user from supplying keywords that have
-no semantic relation with the content and thereby increasing the
-chance of other users finding undesirable results for those keywords.
+This section describes how information about namespaces or the CHK
+keys that are necessary to retrieve a file can be obtained by
+searching using natural language {\em keywords} -- without reveiling
+the keywords to intermediaries.  Searching requires the content
+provider to supply metadata about the file, in particular a list of
+keywords.  It is assumed that the user searching for data is able to
+{\em guess} at least one of these keywords.  The nature of the search
+implies that there is no direct, cryptographically verifiable relation
+between the keyword and the content.  Many files can match a given
+keyword.  Different users may sometimes have a different perception of
+what is a correct semantic match.  Thus a keyword search always has
+the potential of resulting in search results that a user may find
+inappropriate.  It is also not possible to prevent a user from
+supplying keywords that have no semantic relation with the content and
+thereby increasing the chance of other users finding undesirable
+results for those keywords.
 
-However, ECRS should (and can) give some unusual {\em guarantees} for
-keyword-based searches.  First, the keyword used for a search is not
-exposed to intermediaries in a way that would allow them to easily
-exercise editorial control (i.e. to censor queries).  Again a
-guessing attack, where the intermediary guesses the keyword and can
-then compute the query for this keyword, is acceptable.  Plausible
-deniability for the intermediaries is unaffected by this attack.
-Second, only peers that have content available under the given keyword
-should be able to produce a valid response.  In other words, the
-ultimate responder must have succeeded in guessing the keyword.  This
-is important since it prevents peers from making up replies for
-arbitrary requests on-the-fly.  If peers were able to respond to any
-keyword query without having to at least guess the keyword, they could
-use this to spam every possible search, rendering the keyword search
-mostly useless.  Forcing responders to guess keywords does not
-eliminate the problem completely.  However, it does limit the attack
-to the common, easily guessed keywords.  Finally, the verification
-that a response is valid should be possible not only for the final
-recipient, but also for intermediaries.
+Despite these fundamental drawbacks, ECRS should (and can) give some
+unusual {\em guarantees} for keyword-based searches.  First, the
+keyword used for a search is not exposed to intermediaries in a way
+that would allow them to easily exercise editorial control (i.e. to
+censor queries).  Again a guessing attack, where the intermediary
+guesses the keyword and can then compute the query for this keyword,
+is acceptable.  Plausible deniability for the intermediaries is
+unaffected by this attack.  Second, only peers that have content
+available under the given keyword should be able to produce a valid
+response.  In other words, the ultimate responder must have succeeded
+in guessing the keyword.  This is important since it prevents peers
+from making up replies for arbitrary requests on-the-fly.  If peers
+were able to respond to any keyword query without having to at least
+guess the keyword, they could use this to spam every possible search,
+rendering the keyword search mostly useless.  Forcing responders to
+guess keywords does not eliminate the problem completely.  However, it
+does limit the attack to the common, easily guessed keywords.
+Finally, the verification that a response is valid should be possible
+not only for the final recipient, but also for intermediaries.
 
 ECRS achieves all of this with a {\em new cryptographic primitive},
 which is a public-private key pair $(P_{pub}(K), P_{priv}(K))$ that is
@@ -703,9 +701,9 @@
 only input to the pseudo-random number generator that is used in the
 generation of the public-private key pair.  The authors are not aware
 of any previous use of $K$-deterministic public-keys.  Given such a
-$K$-deterministic public-private key, ECRS generates {\em KBlock}s by
-signing the metadata necessary to download the file with $P_{priv}$ by
-the inserting peer.  {\em KBlock}s are essentially like {\em SBlock}s
+$K$-deterministic public-private key, the inserting peer generates
+{\em KBlock}s by signing the metadata necessary to download the file
+with $P_{priv}$.  {\em KBlock}s are essentially like {\em SBlock}s
 only that the $K$-determinate key is used instead of the pseudonym.
 
 A peer searching for $K$ also computes $P_{pub}(K)$ using the same
@@ -789,13 +787,13 @@
 
 \section{Extensions} \label{extensions}
 
-The vanilla ECRS encoding scheme (as discussed in the previous
-section) still leaves some practical problems that should be addressed
-to facilitate real-life usability.  For example, the manual effort of
-assigning or guessing keywords should be minimized. Also, the overall
-system should be efficient in practice; thus, overhead caused by
-random accesses of small blocks and frequent queries must be handled
-properly. The following subsections present some ideas on how these
+The vanilla ECRS encoding scheme still leaves some practical problems
+that should be addressed to facilitate real-life usability.  For
+example, the manual effort of assigning or guessing keywords should be
+minimized. Also, the overall system should be efficient in practice.
+In particular, this requires peers to frequently handle small,
+per-block queries, many of which may not have a answer that is locally
+available.  The following subsections present some ideas on how these
 issues can be addressed.
 
 
@@ -803,14 +801,14 @@
 
 One problem with ECRS is that the content must often be associated
 with keywords.  Although this is vastly better than forcing the user
-to rely on meaningless bitstrings as the only identifier, the keys
+to rely on ``meaningless'' bitstrings as the only identifier, the keys
 must still be chosen so that the target audience can guess them.  The
-simplest non-technical solution for this problem, however, is for a
-group of users to agree on an informal standard for keywords.  If
-content providers want to make it easy for others to guess a keyword,
-it is typically useful to follow informal conventions for keyword
-selection.  For example, a reasonable convention may be to only use
-lower-case.
+simplest non-technical solution for this problem is for a group of
+users to agree on an informal standard for keywords.  If content
+providers want to make it easy for others to guess a keyword, it is
+typically useful to follow informal conventions for keyword selection.
+For example, a reasonable convention may be to only use lower-case
+letters.
 
 A larger problem for a keyword-based search is that users may be
 reluctant to put in the effort to provide good keywords for the
@@ -832,30 +830,29 @@
 provided by a non-malicious party.
 
 Integrating directories into the ECRS scheme is fairly
-straightforward.  A directory is a file with a standard (1k) header
-block that contains any number of {\em SBlock}s or {\em KBlock}s in
-plaintext (!).  Like files, directories are immutable and are
-subjected to the same encoding.
+straightforward.  A directory is simply a file that contains any
+number of {\em SBlock}s or {\em KBlock}s in plaintext (!).  Like
+files, directories are immutable and are subjected to the same
+encoding for sharing.
 
-Note that it is possible for any user to assemble a directory that
-refers to any combination of files: user-inserted files, files that
-the user downloaded, files that the user encountered as search results
-but never downloaded, or even invalid data (which will be interpreted
-as references that correspond to non-existent files).  Directories can
-also refer to other directories, allowing users to build navigable
-structures similar to file systems (without delete or update
-operation) or the World Wide Web.  While deletions and updates are not
-possible, it is possible to refer to contents of other users and even
-to files or directories that are supposed to be published in the
-future.
+Note that it is possible for users to assemble a directory that refers
+to any combination of files: files the user inserted personally, files
+that the user downloaded, files that the user encountered as search
+results but never downloaded, or even invalid data (which would be
+interpreted as references that correspond to non-existent files).
+Directories can also refer to other directories, allowing users to
+build navigable structures similar to file systems or the World Wide
+Web.  In particular it is possible to refer to contents of other users
+and even to files or directories that are supposed to be published in
+the future.
 
 
 \subsection{Efficient lookups with bloom filters}
 
 Given that a query only requires the transmission of a hash code, the
 number of queries that any given peer may receive is quite high.  The
-bandwidth required for the response can generally be discounted, since
-each peer will only be able to respond to a small fraction of the
+bandwidth required for the response can often be discounted, since
+a peer may only be able to respond to a fraction of the
 received queries.  Assuming that queries dominate the traffic, over 50
 queries per second could be transmitted over a slow modem line.  Many
 peers could not perform disk-based database lookups at such rates.
@@ -873,13 +870,14 @@
 
 The size of the bloom filter in memory that is required to reduce the
 number of false-positives to approximately 3\% is about one byte (8
-bit with 5 bloom tests, $2^{-5} \approx 3\%$) per entry.  Since a
-node occasionally needs to remove content from the local database,
-additional bit counters for the bloom filter are stored on the disk.
-The assumption here is that changes to the filter are rare compared to
-the frequency of queries.  Queries that pass through the bloom filter are
-forwarded to the database layer which then attempts to locate the
-content. 
+bit with 5 bloom tests, $2^{-5} \approx 3\%$) per entry.  This reduces
+the memory requirements for the index by a factor of 16-64, depending
+on the size of the hash.  Since a node occasionally needs to remove
+content from the local database, additional bit counters for the bloom
+filter should be stored on the disk.  The assumption here is that
+changes to the filter are rare compared to the frequency of queries.
+Queries that pass through the bloom filter are forwarded to the
+database layer which then attempts to locate the content.
 
 
 
@@ -892,15 +890,15 @@
 encoded on-the-fly, without processing any other part of the file.
 This can be an important benefit if the user intends to keep the file
 in plaintext on the local drive.  In this case, the system can index
-the {\em DBlocks} without replicating the actual data, storing the
-resulting {\em IBlocks} (and {\em SBlocks} and {\em KBlocks}) and then
-later producing the {\em DBlocks} only using the index.  This can
-result in rather dramatic savings in space (no replication of encoded
-content).
+the {\em DBlocks} without replicating the actual data completely,
+storing only the resulting {\em IBlocks} (and {\em SBlocks} and {\em
+KBlocks}) and then later producing the {\em DBlocks} only using the
+index and the original file.  This can result in rather dramatic
+savings in space (no replication of encoded content).
 
 Splitting files into blocks might be perceived as having a negative
-effect on the preservation of data.  If only one of the small pieces
-is lost, the larger file can no longer be reconstructed.  Thus, many
+effect on the preservation of data.  If only one of the blocks is
+lost, the larger file can no longer be reconstructed.  Thus, many
 other systems~\cite{freehaven-berk,mojotech} strive to keep files
 intact or use erasure codes~\cite{rabin89efficient} to patch missing
 pieces.  While erasure codes could be used together with ECRS, they
@@ -923,14 +921,13 @@
 \subsection{Attacks}
 
 ECRS is open to two types of attacks from censors.  The most obvious
-attack available to an adversary is to guess possible keywords and use
-those to compute queries for specific {\em KBlock}s.  The adversary
-can then try to censor these queries.  Since the same content can be
-available under many keywords, this technique is not necessary
-successful.  However, this guessing attack does provide the
-opportunity for limited forms of censorship.  An adversary could
-create a ``blacklist'' of keywords and attempt to legally force
-operators to filter matching queries or replies.
+attack is to guess keywords and use those to compute queries for
+specific {\em KBlock}s.  The adversary can then try to censor these
+queries.  Since the same content can be available under many keywords,
+this technique is not necessary successful.  However, this guessing
+attack does provide the opportunity for limited forms of censorship.
+An adversary could create a ``blacklist'' of keywords and attempt to
+legally force operators to filter matching queries or replies.
 
 Instead of predicting keywords, the attacker can also try to obtain
 the exact contents of the file (or at least the exact contents of an
@@ -944,7 +941,7 @@
 peers in the network. As users must have a way to decrypt the file
 solely by means of guessing the keyword, this attack cannot be
 avoided.  A fault-tolerant peer-to-peer routing protocol may be able
-to route the content around the adversary-controlled censoring peers.
+to route the content around the censoring peers.
 
 If such an active censorship attack is known to occur on a large
 scale, a possible defense would be to publish the content with slight
@@ -968,14 +965,13 @@
 
 Another serious type of attack is spamming the global keyword space
 with useless content.  Popular keywords are an easy target since they
-are likely to be easily guessed by an adversary.  Namespaces can
-theoretically eliminate this problem, however they create a new
-difficulty in assessing which pseudonyms represent users that provide
-valuable content.  A secure reputation system, like
-Advogato~\cite{levien03advogato}, may be a step towards a technical
-solution for this problem.  A possibly more important challenge for
-future work is making such complex solutions easily accessible for the
-average user.
+are by nature easily guessed.  Namespaces can theoretically eliminate
+this problem, however they create a new difficulty in assessing which
+pseudonyms represent users that provide valuable content.  A secure
+reputation system, like Advogato~\cite{levien03advogato}, may be a
+step towards a technical solution for this problem.  A possibly more
+important challenge for future work is making such complex solutions
+easily accessible for the average user.
 
 
 %
@@ -1026,14 +1022,14 @@
 scheme, discuss the attack and then compare it with the {\em KBlock}
 approach taken in this paper.
 
-Let an {\em RBlock} be a block that contains the metadata of a file
-(including the top CHK data).  The only difference between {\em
-RBlock}s and {\em KBlock}s is that {\em RBlock}s are encoded and
-requested using the triple-hash scheme.  For each keyword $k$
-associated with a file, the {\em RBlock} $R$ of the file is encrypted
-with $H(k)$ and stored under $H(H(k))$.  Using the keyword as the
-source for the key allows the receiver of the file to obtain the key
-by guessing.  
+Let an {\em RBlock} be a new kind of block that also contains the
+metadata of a file (including the top CHK data).  The only difference
+between {\em RBlock}s and {\em KBlock}s is that {\em RBlock}s are
+encrypted and requested using the following triple-hash scheme.  For
+each keyword $k$, the {\em RBlock} $R$ is encrypted with $H(k)$ and
+stored as the pair $\{H(H(k)), E_{H(k)}(R)\}$.  Using the keyword as
+the source for the key allows the receiver of the file to obtain the
+key by guessing.
 
 Querying for an {\em RBlock} is {\bf not} straightforward.  The
 problem is that the intuitive choice for a query, $H(H(k))$ does not
@@ -1041,27 +1037,27 @@
 correct.  Instead of using $H(H(k))$, the initiator sends the
 so-called ``triple-hash'' query $H(H(H(k)))$.  A peer that has stored
 $E_{H(k)}(R)$ under $H(H(k))$ can match the query with the response
-and send back the pair $H(H(k)), E_{H(k)}(R)$.  Intermediaries can
+and send back the pair $\{H(H(k)), E_{H(k)}(R)\}$.  Intermediaries can
 verify that the proof of authenticity, $H(H(k))$, hashes to the query
 $H(H(H(k)))$.  Malicious peers cannot construct the proof $H(H(k))$
 without guessing $k$ or inverting the hash function.
 
 The problem with the triple-hash is that an adversary that is routing
 a response to a triple-hash request can substitute the encrypted
-content in the $\{H(H(K)), E_{H(K)}(Q, K, size)\}$ response while
-maintaining the $H(H(K))$ token.  The resulting reply $\{H(H(K)), X\}$
+content in the $\{H(H(k)), E_{H(k)}(CHK, size)\}$ response while
+maintaining the $H(H(k))$ token.  The resulting reply $\{H(H(k)), X\}$
 still looks like a valid response to the triple-hash query
-$H(H(H(K)))$.  The triple-hash thus does not protect against such a
+$H(H(H(k)))$.  The triple-hash thus does not protect against such a
 substitution attack by an intermediary.  The impact of the attack is
-such that the network would propagate and cache the invalid replies.
-The attack will not prevent the spread of valid replies through other
-routes in the system since multiple results to the same query are
-possible.  Furthermore, any user searching for $K$ will not see the
-invalid results.  The reason is that the attempt to decrypt $X$ with
-$H(K)$ will (with high probability) result in a malformed {\em
-RBlock}.  Thus, the end-user is still protected from this type of
-spam.  Nevertheless, the adversary can abuse network resources for
-transmitting and caching $X$.
+such that the network would propagate and possibly cache the invalid
+replies.  The attack will not prevent the spread of valid replies
+through other routes in the system since multiple results to the same
+query are possible.  Furthermore, any user searching for $K$ will not
+see the invalid results.  The reason is that the attempt to decrypt
+$X$ with $H(K)$ will (with high probability) result in a malformed
+{\em RBlock}.  Thus, the end-user is still protected from this type of
+spam.  Nevertheless, the adversary can abuse network resources in the
+form of transmission and caching of invalid data.
 
 Replacing the triple-hash with {\em KBlock}s for ECRS comes at a
 relatively high price.  Where the tripe-hash only requires a simple
@@ -1085,21 +1081,20 @@
 
 \section{Conclusion} \label{conclusion}
 
-This paper has described an encoding scheme which is able to produce
-the same ciphertext (with the exception of one small {\em KBlock} per
-keyword) for the encryption of a file independent of the key(words)
-chosen by the content providers.  The resulting ciphertext is not
-significantly larger than the plaintext.  Arbitrary pieces of the
-ciphertext can be generated from plaintext without reading unrelated
-parts of the plaintext.  The encoding mechanism makes it difficult for
-censors to selectively suppress content.  While dictionary attacks on
-the password and known plaintext attacks on the ciphertext are still
-possible, they are harmless with respect to the goal of deniability
-for intermediaries.  The basic encoding scheme can be extended with
-directories and namespaces which allow for restricting searches to
-content published by known pseudonyms.  Namespaces allow for files and
-directories to be updated.
+This paper has described an encoding scheme which hides the shared
+data from intermediaries.  The encoding uses convergent encryption,
+allows swarming and produces a ciphertext that is not significantly
+larger than the plaintext.  Individual blocks of the ciphertext can be
+generated from plaintext without reading unrelated parts of the
+original.  While dictionary attacks on the keywords or known
+plaintext attacks on the content are still possible, they are harmless
+with respect to the goal of deniability for intermediaries.  The basic
+encoding scheme can be extended with directories and namespaces.
+Namespaces allow for files and directories to be updated.  Using
+$k$-deterministic public-private keys for signing content it is
+possible to verify search results in a global keyword space.
 
+\newpage
 ECRS is implemented as a part of {\sc gnu}net, a secure platform for
 peer-to-peer networking.  In {\sc gnu}net, ECRS works towards
 implementing anonymous, censorship-resistant file-sharing.  {\sc

Modified: gnunet-gtk/TODO
===================================================================
--- gnunet-gtk/TODO     2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/TODO     2005-06-02 15:05:35 UTC (rev 843)
@@ -1,39 +1,41 @@
 High priority (for 0.7.0pre3):
 * basic FS integration:
-  - download (Tuesday/Wednesday)
-    + find selection, start FSUI download
-    + add download to download view:   
-      - construct view
-      - maintain view
-    + process progress events
-      - update download view
-      - show contents of directory in associated search view!
   - insert (Thursday/Friday?)
-    + launch file selection window
-    + launch meta-data edit window
-    + launch insertion process
-    + add insertion to insertion view
-    + process insertion progress events
+    + launch file selection window [ medium ]
+    + launch meta-data edit window [ medium ]
+    + launch insertion process [ medium ]
+    + add insertion to insertion view [ easy ]
+    + process insertion progress events [ easy ]
 
 Important (for 0.7.0):
 * make use of anonymity level specification widgets (easy):
   - search
   - download
   - upload
-* implement advanced FS operations (namespace, collection)
+* implement advanced FS operations (namespace, collection) [ medium ]
 * search:
-  + update namespace list combo box
-  + support namespace URIs
+  + update namespace list combo box [ easy ]
+  + support namespace URIs [ easy ]
 * insertion:
-  + support nice progress view for recursive insertions
-* stats integration
-* available apps
+  + support nice progress view for recursive insertions [ medium ]
+* stats integration [ medium ]
+* available apps [ medium ]
+* highlight completed downloads [ easy ]
+* highlight active downloads in search list [ easy ]
+* allow user to cancel downloads [ medium ]
+* allow user to clear completed downloads from summary [ easy ]
+* process download progress events:
+  - show contents of directory in associated search view! [ DIFFICULT, CG ]
+* auto-rename downloaded files to better names (user feedback!?) [ medium ]
+* cleanup-code (enum instead of 1,2,3,4)
 
 Later (0.7.1):
-* more help-texts
-* pop-up dialogs
-* chat
-* look into I18N
+* more help-texts (glade, easy)
+* pop-up dialogs / context menus (medium)
+* chat (difficult)
+* look into I18N (difficult)
+* disable inactive buttons (if no search/download is selected to
+  operate on)
 
 
 gnunet-gtk wishlist (from pre-0.7.0 days):

Modified: gnunet-gtk/gnunet-gtk.glade
===================================================================
--- gnunet-gtk/gnunet-gtk.glade 2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/gnunet-gtk.glade 2005-06-02 15:05:35 UTC (rev 843)
@@ -658,8 +658,8 @@
                              <property name="visible">True</property>
                              <property name="can_focus">True</property>
                              <property name="headers_visible">True</property>
-                             <property name="rules_hint">False</property>
-                             <property name="reorderable">False</property>
+                             <property name="rules_hint">True</property>
+                             <property name="reorderable">True</property>
                              <property name="enable_search">True</property>
                              <property 
name="fixed_height_mode">False</property>
                              <property name="hover_selection">False</property>
@@ -707,27 +707,91 @@
                      <property 
name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
 
                      <child>
-                       <widget class="GtkScrolledWindow" id="scrolledwindow7">
+                       <widget class="GtkVBox" id="vbox15">
                          <property name="visible">True</property>
-                         <property 
name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                         <property 
name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                         <property name="shadow_type">GTK_SHADOW_IN</property>
-                         <property 
name="window_placement">GTK_CORNER_TOP_LEFT</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
 
                          <child>
-                           <widget class="GtkTreeView" 
id="activeDownloadsList">
-                             <property agent="glademm" 
name="cxx_visibility">public</property>
+                           <widget class="GtkScrolledWindow" 
id="scrolledwindow20">
                              <property name="visible">True</property>
                              <property name="can_focus">True</property>
-                             <property name="headers_visible">True</property>
-                             <property name="rules_hint">False</property>
-                             <property name="reorderable">False</property>
-                             <property name="enable_search">True</property>
-                             <property 
name="fixed_height_mode">False</property>
-                             <property name="hover_selection">False</property>
-                             <property name="hover_expand">False</property>
+                             <property 
name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                             <property 
name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                             <property 
name="shadow_type">GTK_SHADOW_IN</property>
+                             <property 
name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                             <child>
+                               <widget class="GtkTreeView" 
id="activeDownloadsList">
+                                 <property agent="glademm" 
name="cxx_visibility">public</property>
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property 
name="headers_visible">True</property>
+                                 <property name="rules_hint">True</property>
+                                 <property name="reorderable">True</property>
+                                 <property name="enable_search">True</property>
+                                 <property 
name="fixed_height_mode">False</property>
+                                 <property 
name="hover_selection">False</property>
+                                 <property name="hover_expand">False</property>
+                               </widget>
+                             </child>
                            </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
                          </child>
+
+                         <child>
+                           <widget class="GtkHBox" id="hbox26">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">0</property>
+
+                             <child>
+                               <widget class="GtkButton" 
id="abortDownloadButton">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" 
translatable="yes">Cancel the selected download</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label">gtk-cancel</property>
+                                 <property name="use_stock">True</property>
+                                 <property 
name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property 
name="focus_on_click">True</property>
+                                 <signal name="clicked" 
handler="on_abortDownloadButton_clicked" last_modification_time="Wed, 01 Jun 
2005 19:54:07 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                                 <property 
name="pack_type">GTK_PACK_END</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkButton" 
id="clearCompletedDownloadsButton">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label">gtk-clear</property>
+                                 <property name="use_stock">True</property>
+                                 <property 
name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property 
name="focus_on_click">True</property>
+                                 <signal name="clicked" 
handler="on_clearCompletedDownloadsButton_clicked" last_modification_time="Wed, 
01 Jun 2005 19:53:58 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                                 <property 
name="pack_type">GTK_PACK_END</property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
                        </widget>
                      </child>
 
@@ -782,8 +846,8 @@
                              <property name="visible">True</property>
                              <property name="can_focus">True</property>
                              <property name="headers_visible">True</property>
-                             <property name="rules_hint">False</property>
-                             <property name="reorderable">False</property>
+                             <property name="rules_hint">True</property>
+                             <property name="reorderable">True</property>
                              <property name="enable_search">True</property>
                              <property 
name="fixed_height_mode">False</property>
                              <property name="hover_selection">False</property>
@@ -825,7 +889,7 @@
                </widget>
                <packing>
                  <property name="tab_expand">False</property>
-                 <property name="tab_fill">True</property>
+                 <property name="tab_fill">False</property>
                </packing>
              </child>
 
@@ -1439,7 +1503,6 @@
                          <property name="add_tearoffs">False</property>
                          <property name="has_frame">True</property>
                          <property name="focus_on_click">True</property>
-                         <signal name="editing_done" 
handler="on_uploadFilenameComboBoxEntry_editing_done" 
last_modification_time="Sat, 28 May 2005 14:43:26 GMT"/>
                        </widget>
                        <packing>
                          <property name="padding">0</property>
@@ -1541,7 +1604,7 @@
                      <property name="can_focus">True</property>
                      <property name="relief">GTK_RELIEF_NORMAL</property>
                      <property name="focus_on_click">True</property>
-                     <signal name="clicked" 
handler="on_fsinsertuploadbutton_clicked" object="fsinsertvbox" 
last_modification_time="Mon, 23 May 2005 19:12:55 GMT"/>
+                     <signal name="clicked" 
handler="on_fsinsertuploadbutton_clicked" last_modification_time="Mon, 23 May 
2005 19:12:55 GMT"/>
 
                      <child>
                        <widget class="GtkAlignment" id="alignment9">
@@ -1862,10 +1925,10 @@
                                      <property name="visible">True</property>
                                      <property name="can_focus">True</property>
                                      <property 
name="headers_visible">True</property>
-                                     <property 
name="rules_hint">False</property>
-                                     <property 
name="reorderable">False</property>
+                                     <property 
name="rules_hint">True</property>
+                                     <property 
name="reorderable">True</property>
                                      <property 
name="enable_search">True</property>
-                                     <property 
name="fixed_height_mode">False</property>
+                                     <property 
name="fixed_height_mode">True</property>
                                      <property 
name="hover_selection">False</property>
                                      <property 
name="hover_expand">False</property>
                                    </widget>
@@ -2003,7 +2066,7 @@
          </child>
 
          <child>
-           <widget class="GtkLabel" id="label5">
+           <widget class="GtkLabel" id="statisticsLabel">
              <property name="visible">True</property>
              <property name="label" translatable="yes">_Statistics</property>
              <property name="use_underline">True</property>
@@ -2241,7 +2304,7 @@
 </widget>
 
 <widget class="GtkDialog" id="metaDataDialog">
-  <property name="visible">True</property>
+  <property agent="glademm" name="cxx_visibility">public</property>
   <property name="title" translatable="yes">Edit File Information</property>
   <property name="type">GTK_WINDOW_TOPLEVEL</property>
   <property name="window_position">GTK_WIN_POS_NONE</property>
@@ -2271,44 +2334,22 @@
       <child internal-child="action_area">
        <widget class="GtkHButtonBox" id="dialog-action_area1">
          <property name="visible">True</property>
-         <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
+         <property name="layout_style">GTK_BUTTONBOX_END</property>
 
          <child>
-           <widget class="GtkButton" id="metaDataDialogDeleteButton">
-             <property name="visible">True</property>
-             <property name="sensitive">False</property>
-             <property name="tooltip" translatable="yes">Use this button to 
delete meta-data or keywords.</property>
-             <property name="can_default">True</property>
-             <property name="can_focus">True</property>
-             <property name="label">gtk-delete</property>
-             <property name="use_stock">True</property>
-             <property name="relief">GTK_RELIEF_NORMAL</property>
-             <property name="focus_on_click">True</property>
-             <property name="response_id">0</property>
-             <accessibility>
-               <atkproperty name="AtkObject::accessible_name" 
translatable="yes">Delete button</atkproperty>
-             </accessibility>
-             <signal name="activate" 
handler="on_metaDataDialogDeleteButton_clicked" object="metaDataDialog" 
last_modification_time="Mon, 23 May 2005 18:49:51 GMT"/>
-             <accelerator key="Delete" modifiers="0" signal="activate"/>
-           </widget>
-         </child>
-
-         <child>
            <widget class="GtkButton" id="metaDataDialogCancelButton">
              <property name="visible">True</property>
              <property name="can_default">True</property>
              <property name="can_focus">True</property>
-             <property name="label">gtk-cancel</property>
+             <property name="label">gtk-ok</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
              <property name="focus_on_click">True</property>
-             <property name="response_id">-6</property>
+             <property name="response_id">-5</property>
              <accessibility>
                <atkproperty name="AtkObject::accessible_name" 
translatable="yes">metaDataDialogCancelButton</atkproperty>
                <atkproperty name="AtkObject::accessible_description" 
translatable="yes">Abort the upload operation.</atkproperty>
              </accessibility>
-             <signal name="clicked" handler="gtk_widget_destroy" 
object="metaDataDialog" last_modification_time="Mon, 23 May 2005 18:51:21 GMT"/>
-             <signal name="activate" handler="gtk_widget_destroy" 
object="metaDataDialog" last_modification_time="Mon, 23 May 2005 18:53:50 GMT"/>
              <accelerator key="Escape" modifiers="0" signal="activate"/>
            </widget>
          </child>
@@ -2318,12 +2359,11 @@
              <property name="visible">True</property>
              <property name="can_default">True</property>
              <property name="can_focus">True</property>
-             <property name="label">gtk-apply</property>
+             <property name="label">gtk-cancel</property>
              <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
              <property name="focus_on_click">True</property>
-             <property name="response_id">-10</property>
-             <signal name="clicked" 
handler="on_metaDataDialogApplyButton_clicked" object="metaDataDialog" 
last_modification_time="Mon, 23 May 2005 18:54:12 GMT"/>
+             <property name="response_id">-6</property>
              <accelerator key="A" modifiers="GDK_MOD1_MASK" signal="activate"/>
            </widget>
          </child>
@@ -2380,7 +2420,6 @@
              <property name="yalign">0.5</property>
              <property name="xpad">5</property>
              <property name="ypad">0</property>
-             <property name="mnemonic_widget">optionmenu2</property>
              <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
              <property name="width_chars">-1</property>
              <property name="single_line_mode">False</property>
@@ -2394,30 +2433,16 @@
          </child>
 
          <child>
-           <widget class="GtkOptionMenu" id="optionmenu2">
+           <widget class="GtkComboBox" id="metaDataDialogMetaTypeComboBox">
              <property agent="glademm" name="cxx_visibility">public</property>
              <property name="visible">True</property>
-             <property name="can_focus">True</property>
-             <property name="history">0</property>
-
-             <child internal-child="menu">
-               <widget class="GtkMenu" id="convertwidget30">
-                 <property name="visible">True</property>
-
-                 <child>
-                   <widget class="GtkMenuItem" id="convertwidget31">
-                     <property name="visible">True</property>
-                     <property name="label" 
translatable="yes">unknown</property>
-                     <property name="use_underline">True</property>
-                   </widget>
-                 </child>
-               </widget>
-             </child>
+             <property name="add_tearoffs">False</property>
+             <property name="focus_on_click">True</property>
            </widget>
            <packing>
              <property name="padding">0</property>
-             <property name="expand">False</property>
-             <property name="fill">False</property>
+             <property name="expand">True</property>
+             <property name="fill">True</property>
            </packing>
          </child>
 
@@ -2474,6 +2499,23 @@
              <property name="fill">True</property>
            </packing>
          </child>
+
+         <child>
+           <widget class="GtkButton" id="metaDataDialogMetaDataAddButton">
+             <property name="visible">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-add</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <signal name="clicked" 
handler="on_metaDataDialogMetaDataAddButton_clicked" 
last_modification_time="Thu, 02 Jun 2005 12:44:47 GMT"/>
+           </widget>
+           <packing>
+             <property name="padding">5</property>
+             <property name="expand">False</property>
+             <property name="fill">False</property>
+           </packing>
+         </child>
        </widget>
        <packing>
          <property name="padding">0</property>
@@ -2490,7 +2532,7 @@
          <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
 
          <child>
-           <widget class="GtkScrolledWindow" id="scrolledwindow10">
+           <widget class="GtkScrolledWindow" id="metaDataDialogScrolledWindow">
              <property name="visible">True</property>
              <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
              <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
@@ -2504,7 +2546,7 @@
                  <property name="can_focus">True</property>
                  <property name="headers_visible">True</property>
                  <property name="rules_hint">True</property>
-                 <property name="reorderable">False</property>
+                 <property name="reorderable">True</property>
                  <property name="enable_search">True</property>
                  <property name="fixed_height_mode">False</property>
                  <property name="hover_selection">False</property>
@@ -2599,6 +2641,23 @@
              <property name="fill">True</property>
            </packing>
          </child>
+
+         <child>
+           <widget class="GtkButton" id="metaDataDialogKeywordAddButton">
+             <property name="visible">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-add</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <signal name="clicked" 
handler="on_metaDataDialogKeywordAddButton_clicked" 
last_modification_time="Thu, 02 Jun 2005 12:46:16 GMT"/>
+           </widget>
+           <packing>
+             <property name="padding">5</property>
+             <property name="expand">False</property>
+             <property name="fill">False</property>
+           </packing>
+         </child>
        </widget>
        <packing>
          <property name="padding">0</property>
@@ -2633,7 +2692,7 @@
                  <property name="can_focus">True</property>
                  <property name="headers_visible">False</property>
                  <property name="rules_hint">True</property>
-                 <property name="reorderable">False</property>
+                 <property name="reorderable">True</property>
                  <property name="enable_search">True</property>
                  <property name="fixed_height_mode">False</property>
                  <property name="hover_selection">False</property>
@@ -2745,12 +2804,12 @@
              <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
 
              <child>
-               <widget class="GtkTreeView" id="clist10">
+               <widget class="GtkTreeView" id="metaDisplayDialogTreeView">
                  <property agent="glademm" 
name="cxx_visibility">public</property>
                  <property name="visible">True</property>
                  <property name="can_focus">True</property>
                  <property name="headers_visible">True</property>
-                 <property name="rules_hint">False</property>
+                 <property name="rules_hint">True</property>
                  <property name="reorderable">False</property>
                  <property name="enable_search">True</property>
                  <property name="fixed_height_mode">False</property>
@@ -2844,8 +2903,8 @@
                      <property name="visible">True</property>
                      <property name="can_focus">True</property>
                      <property name="headers_visible">True</property>
-                     <property name="rules_hint">False</property>
-                     <property name="reorderable">False</property>
+                     <property name="rules_hint">True</property>
+                     <property name="reorderable">True</property>
                      <property name="enable_search">True</property>
                      <property name="fixed_height_mode">False</property>
                      <property name="hover_selection">False</property>
@@ -3075,10 +3134,10 @@
              <property name="visible">True</property>
              <property name="can_focus">True</property>
              <property name="headers_visible">True</property>
-             <property name="rules_hint">False</property>
-             <property name="reorderable">False</property>
+             <property name="rules_hint">True</property>
+             <property name="reorderable">True</property>
              <property name="enable_search">True</property>
-             <property name="fixed_height_mode">False</property>
+             <property name="fixed_height_mode">True</property>
              <property name="hover_selection">False</property>
              <property name="hover_expand">False</property>
              <signal name="select_cursor_row" 
handler="on_namespaceContentFrameTreeView_select_cursor_row" 
object="namespaceContentFrame" last_modification_time="Mon, 23 May 2005 
19:02:36 GMT"/>
@@ -3468,7 +3527,7 @@
              <property name="visible">True</property>
              <property name="can_focus">True</property>
              <property name="headers_visible">True</property>
-             <property name="rules_hint">False</property>
+             <property name="rules_hint">True</property>
              <property name="reorderable">False</property>
              <property name="enable_search">True</property>
              <property name="fixed_height_mode">False</property>
@@ -3814,4 +3873,74 @@
   <property name="logo">gnunet_logo.png</property>
 </widget>
 
+<widget class="GtkFileChooserDialog" id="uploadfilechooserdialog">
+  <property agent="glademm" name="cxx_visibility">public</property>
+  <property name="visible">True</property>
+  <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
+  <property name="local_only">False</property>
+  <property name="select_multiple">False</property>
+  <property name="show_hidden">False</property>
+  <property name="title" translatable="yes">Select file to upload to 
GNUnet</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">True</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">up.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">True</property>
+  <property name="skip_pager_hint">True</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox3">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">24</property>
+
+      <child internal-child="action_area">
+       <widget class="GtkHButtonBox" id="dialog-action_area3">
+         <property name="visible">True</property>
+         <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+         <child>
+           <widget class="GtkButton" id="button1">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-cancel</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <property name="response_id">-6</property>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="button2">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="has_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-open</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <property name="response_id">-5</property>
+           </widget>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">False</property>
+         <property name="fill">True</property>
+         <property name="pack_type">GTK_PACK_END</property>
+       </packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
 </glade-interface>

Added: gnunet-gtk/pixmaps/up.png
===================================================================
(Binary files differ)


Property changes on: gnunet-gtk/pixmaps/up.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: gnunet-gtk/src/Makefile.am
===================================================================
--- gnunet-gtk/src/Makefile.am  2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/Makefile.am  2005-06-02 15:05:35 UTC (rev 843)
@@ -17,13 +17,15 @@
   helper.c helper.h \
   main.c main.h \
   platform.h plibc.h \
-  search.c 
+  search.c search.h \
+  upload.c upload.h
 
 gnunet_gtk_LDADD = \
   @GTK_LIBS@ \
   @GNUNETGTK_LIBS@ \
   $(INTLLIBS) \
-  -lgthread-2.0
+  -lgthread-2.0 \
+  -lextractor
 
 gnunet_gtk_LDFLAGS = \
   -export-dynamic 

Modified: gnunet-gtk/src/download.c
===================================================================
--- gnunet-gtk/src/download.c   2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/download.c   2005-06-02 15:05:35 UTC (rev 843)
@@ -25,6 +25,8 @@
  */
 
 #include "platform.h"
+#include "main.h"
+#include "fs.h"
 #include "search.h"
 #include "helper.h"
 #include <extractor.h>
@@ -38,6 +40,8 @@
 
 static DownloadList * head;
 
+static GtkTreeStore * summary;
+
 static void initiateDownload(GtkTreeModel *model,
                             GtkTreePath * path,
                             GtkTreeIter * iter,
@@ -48,16 +52,22 @@
   char * pfx;
   char * fn;
   DownloadList * list;
+  GtkTreeIter iiter;
+  char * name;
+  struct stat sbuf;
 
   uri = NULL;
   meta = NULL;
+  name = NULL;
   gtk_tree_model_get(model,
                     iter,
+                    0, &name,
                     5, &uri,
                     6, &meta,
                     -1);
   if (uri == NULL) {
     BREAK();
+    FREENONNULL(name);
     return;
   }
   filename = ECRS_uriToString(uri);  
@@ -66,33 +76,70 @@
        strlen(ECRS_URI_PREFIX) +
        strlen(ECRS_FILE_INFIX)) ) {
     BREAK();
+    FREENONNULL(name);
     FREENONNULL(filename);
     return;
   }
+  if (name == NULL)
+    name = STRDUP(_("unnamed"));
   list = MALLOC(sizeof(DownloadList));
   list->next = head;
-  list->rr = gtk_tree_row_reference_new(model, path);
+  list->rr = NULL;
+  if (ECRS_isDirectory(meta))
+    list->rr = gtk_tree_row_reference_new(model, path);
   list->uri = ECRS_dupUri(uri);
   fn = getFileName("FS",
                   "DOWNLOADDIR",
-                  _("You must specify a directory in the configuration in 
section '%s' under '%s'."));
+                  _("You must specify a directory in the configuration"
+                    " in section '%s' under '%s'."));
+  mkdirp(fn);
   pfx = MALLOC(strlen(fn) + 2 +
-              strlen(filename));
+              strlen(filename) + strlen(name));
   strcpy(pfx, fn);
-  FREE(fn);
   strcat(pfx, 
         DIR_SEPARATOR_STR);
-  strcat(pfx,
-        &filename[strlen(ECRS_URI_PREFIX) +
-                  strlen(ECRS_FILE_INFIX)]);
+  strcat(pfx, 
+        name);
+  if (0 == STAT(pfx,
+               &sbuf)) {
+    guiMessage(_("File '%s' exists in '%s',\n"
+                "will store download under its GNUnet URI '%s' instead.\n"),
+              name,
+              fn,
+              &filename[strlen(ECRS_URI_PREFIX) +
+                        strlen(ECRS_FILE_INFIX)]);              
+    strcpy(pfx, fn);
+    strcat(pfx, 
+          DIR_SEPARATOR_STR);
+    strcat(pfx,
+          &filename[strlen(ECRS_URI_PREFIX) +
+                    strlen(ECRS_FILE_INFIX)]);
+  }
+  FREE(fn);
+  
+
   list->filename = pfx;
   head = list;
-  /* FIXME:
-     update download model! */
 
+  gtk_tree_store_insert(summary,
+                       &iiter,
+                       NULL,
+                       0);
+  gtk_tree_store_set(summary,
+                    &iiter,
+                    0, name,
+                    1, ECRS_fileSize(uri),
+                    2, 0, /* progress */
+                    3, filename,
+                    4, ECRS_dupUri(uri),
+                    5, list->rr, /* internal: row reference! */
+                    -1);
+  FREE(filename);
+  FREE(name);
+
   FSUI_startDownload(ctx,
-                    getConfigurationString("GNUNET-GTK",
-                                           "ANONYMITY"), /* FIXME: get value 
from UI! */
+                    getConfigurationInt("GNUNET-GTK",
+                                        "ANONYMITY"), /* FIXME: get value from 
UI! */
                     uri,
                     pfx);
 }
@@ -109,41 +156,109 @@
 
 /**
  */
-void displayDownloadUpdate(...) {
-  /* fixme: update download model */
+void displayDownloadUpdate(const struct ECRS_URI * uri,
+                          unsigned long long completed) {
+  GtkTreeIter iter;
+  unsigned int val;
+  unsigned long long total;
+  struct ECRS_URI * u;
+
+  if (! gtk_tree_model_get_iter_first(GTK_TREE_MODEL(summary),
+                                     &iter))
+    return;
+  do {    
+    
+    gtk_tree_model_get(GTK_TREE_MODEL(summary),
+                      &iter,
+                      1, &total,
+                      4, &u,
+                      -1);
+    if (ECRS_equalsUri(u, uri)) {
+      val = completed * 100 / total;
+      gtk_tree_store_set(GTK_TREE_STORE(summary),
+                        &iter,
+                        2, val,
+                        -1);  
+      break;
+    }
+  } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(summary),
+                                   &iter));
 }
 
 /**
  */
-void displayDownloadComplete(...) {
-  /* fixme: update download model */
+void displayDownloadComplete(const struct ECRS_URI * uri,
+                            const char * filename) {
+  char * ren;
+
+  ren = ECRS_suggestFilename(filename);
+  if (ren == NULL)
+    return;
+  if (0 != strcmp(ren,
+                 filename)) {
+    /* fixme: ask user for confirmation? */
+    /* rename(filename, ren); */
+  }
+  FREE(ren);
+  /* fixme: also update download model? */
 }
 
+static int addDownloadView(void * cls,
+                          const char * filename,
+                          const struct ECRS_URI * uri,
+                          unsigned long long filesize,
+                          unsigned long long bytesCompleted,
+                          int isRecursive,
+                          unsigned int anonymityLevel) {
+  GtkTreeIter iiter;
+  int progress;
+  char * uriname;
+
+  progress = bytesCompleted * 100 / filesize;
+  uriname = ECRS_uriToString(uri);
+  gtk_tree_store_insert(summary,
+                       &iiter,
+                       NULL,
+                       0);
+  gtk_tree_store_set(summary,
+                    &iiter,
+                    0, filename,
+                    1, filesize,
+                    2, progress,
+                    3, uriname,
+                    4, ECRS_dupUri(uri),
+                    5, NULL,
+                    -1);
+  FREE(uriname);
+  return OK;
+}
+
+
+
 void fs_download_start() {
   GtkWidget * downloadList;
   GtkCellRenderer * renderer;
-  GtkTreeStore * tree;
+
  
-  downloadList = glade_xml_get_widget(xml,
+  downloadList = glade_xml_get_widget(mainXML,
                                      "activeDownloadsList");
-  tree =
-    gtk_tree_store_new(8,
+  summary =
+    gtk_tree_store_new(6,
                       G_TYPE_STRING, /* name */
                       G_TYPE_UINT64,  /* size */
-                      G_TYPE_STRING, /* mime-type */                        
-                      G_TYPE_STRING, /* meta-data (some) */                    
     
-                      GDK_TYPE_PIXBUF, /* preview */                        
+                      G_TYPE_INT,  /* progress */
+                      G_TYPE_STRING, /* uri */                      
                       G_TYPE_POINTER,  /* url */
-                      G_TYPE_POINTER,  /* meta */
-                      G_TYPE_POINTER); /* internal: download info/NULL */
+                      G_TYPE_POINTER); /* internal: gtk tree path / NULL */
   gtk_tree_view_set_model(GTK_TREE_VIEW(downloadList),
-                         GTK_TREE_MODEL(tree));
-  renderer = gtk_cell_renderer_text_new();
+                         GTK_TREE_MODEL(summary));
+  renderer = gtk_cell_renderer_progress_new();
   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(downloadList),
                                              -1,
                                              _("Name"),
                                              renderer,
-                                             "text", 0, 
+                                             "value", 2,
+                                             "text", 0,
                                              NULL);
   renderer = gtk_cell_renderer_text_new();
   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(downloadList),
@@ -155,28 +270,37 @@
   renderer = gtk_cell_renderer_text_new();
   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(downloadList),
                                              -1,
-                                             _("Mime-type"),
+                                             _("URI"),
                                              renderer,
-                                             "text", 2,
-                                             NULL);
-  renderer = gtk_cell_renderer_text_new();
-  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(downloadList),
-                                             -1,
-                                             _("Meta-data"),
-                                             renderer,
                                              "text", 3,
                                              NULL);
-  renderer = gtk_cell_renderer_pixbuf_new();
-  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(downloadList),
-                                             -1,
-                                             _("Preview"),
-                                             renderer,
-                                             "pixbuf", 4,
-                                             NULL);
+  FSUI_listDownloads(ctx,
+                    &addDownloadView,
+                    NULL);
 }
 
+
+
 void fs_download_stop() {
-  /* FIXME: destroy download model */
+  GtkTreeIter iter;
+  struct ECRS_URI * u;
+
+  /* free URIs in summary model */
+  if (! gtk_tree_model_get_iter_first(GTK_TREE_MODEL(summary),
+                                     &iter))
+    return;
+  do {    
+    gtk_tree_model_get(GTK_TREE_MODEL(summary),
+                      &iter,
+                      4, &u,
+                      -1);
+    gtk_tree_store_set(GTK_TREE_STORE(summary),
+                      &iter,
+                      4, NULL,
+                      -1);  
+    ECRS_freeUri(u);
+  } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(summary),
+                                   &iter));
 }
 
 

Added: gnunet-gtk/src/download.h
===================================================================
--- gnunet-gtk/src/download.h   2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/download.h   2005-06-02 15:05:35 UTC (rev 843)
@@ -0,0 +1,47 @@
+/*
+     This file is part of GNUnet.
+     (C) 2005 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 2, 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 src/download.h
+ * @brief code for downloading with gnunet-gtk
+ * @author Christian Grothoff
+ */
+
+#ifndef GTK_DOWNLOAD_H
+#define GTK_DOWNLOAD_H
+
+#include "main.h"
+#include "fs.h"
+
+/**
+ */
+void displayDownloadUpdate(const struct ECRS_URI * uri,
+                          unsigned long long completed);
+
+/**
+ */
+void displayDownloadComplete(const struct ECRS_URI * uri,
+                            const char * filename);
+
+void fs_download_start(void);
+
+void fs_download_stop(void);
+
+#endif

Modified: gnunet-gtk/src/fs.c
===================================================================
--- gnunet-gtk/src/fs.c 2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/fs.c 2005-06-02 15:05:35 UTC (rev 843)
@@ -28,6 +28,7 @@
 #include "helper.h"
 #include "download.h"
 #include "search.h"
+#include "upload.h"
 #include <GNUnet/gnunet_fsui_lib.h>
 
 struct FSUI_Context * ctx;
@@ -48,10 +49,16 @@
        event->data.message);
     break;
   case download_progress:
-    BREAK();
+    displayDownloadUpdate(event->data.DownloadProgress.uri,
+                         event->data.DownloadProgress.completed);
+    /* FIXME: 
+       if directory, also update search view! */
     break;
   case download_complete:
-    BREAK();
+    displayDownloadComplete(event->data.DownloadProgress.uri,
+                           event->data.DownloadProgress.filename);
+    /* FIXME: 
+       if directory, also update search view! */
     break;
   case download_error:
     LOG(LOG_ERROR,
@@ -105,12 +112,31 @@
                   NULL);
   fs_search_start();
   fs_download_start();
+  fs_upload_start();
 }
 
-void gtk_fs_done() {
+static void * shutdownCode(Semaphore * sig) {
   fs_download_stop();
   fs_search_stop();
   FSUI_stop(ctx);
+  fs_upload_stop();
+  SEMAPHORE_UP(sig);
+  return NULL;
 }
 
+void gtk_fs_done() {
+  PTHREAD_T doneThread;
+  Semaphore * sig;
+
+  sig = SEMAPHORE_NEW(0);
+  if (0 != PTHREAD_CREATE(&doneThread,
+                         (PThreadMain)&shutdownCode,
+                         sig,
+                         8*1024))
+    DIE_STRERROR("pthread_create");
+  while (OK != SEMAPHORE_DOWN_NONBLOCKING(sig))
+    gtkRunSomeSaveCalls();
+  SEMAPHORE_FREE(sig);
+}
+
 /* end of fs.c */

Modified: gnunet-gtk/src/helper.c
===================================================================
--- gnunet-gtk/src/helper.c     2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/helper.c     2005-06-02 15:05:35 UTC (rev 843)
@@ -43,6 +43,8 @@
 static unsigned int pscCount;
 static Mutex sclock;
 
+static int saveCallsUp;
+
 /**
  * Call a callback function from the mainloop/main thread ("SaveCall").
  * Since GTK doesn't work with multi-threaded applications under Windows,
@@ -55,7 +57,8 @@
   call.args = args;
   call.func = func;
   MUTEX_LOCK(&sclock);
-  if (! PTHREAD_SELF_TEST(&mainThread)) {
+  if ( (saveCallsUp == NO) ||
+       (! PTHREAD_SELF_TEST(&mainThread)) ) {
     call.sem = SEMAPHORE_NEW(0);
     GROW(psc,
         pscCount,
@@ -90,6 +93,7 @@
 void gtkInitSaveCalls() {
   MUTEX_CREATE_RECURSIVE(&sclock);
   PTHREAD_GET_SELF(&mainThread);
+  saveCallsUp = YES;
 }
 
 int gtkRunSomeSaveCalls() {
@@ -120,6 +124,8 @@
 
 void gtkDoneSaveCalls() {
   int i;
+
+  saveCallsUp = NO;
   PTHREAD_REL_SELF(&mainThread);
   MUTEX_LOCK(&sclock);
   for (i=0;i<pscCount;i++) 

Modified: gnunet-gtk/src/main.c
===================================================================
--- gnunet-gtk/src/main.c       2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/main.c       2005-06-02 15:05:35 UTC (rev 843)
@@ -126,12 +126,12 @@
   gtk_main();
   gdk_threads_leave(); 
   setCustomLogProc(NULL);
-  gtkDoneSaveCalls();
   stopCron();
   delCronJob(&cronCheckDaemon, 
             15 * cronSECONDS,
             NULL);
   gtk_fs_done();
+  gtkDoneSaveCalls();
   UNREF(mainXML);
   doneUtil();
   

Added: gnunet-gtk/src/search.c
===================================================================
--- gnunet-gtk/src/search.c     2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/search.c     2005-06-02 15:05:35 UTC (rev 843)
@@ -0,0 +1,661 @@
+/*
+     This file is part of GNUnet.
+     (C) 2005 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 2, 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 src/search.c
+ * @brief code for searching with gnunet-gtk
+ * @author Christian Grothoff
+ */
+
+#include "platform.h"
+#include "search.h"
+#include "helper.h"
+#include <extractor.h>
+
+/**
+ * @brief linked list of pages in the search notebook
+ */
+typedef struct SL {
+  struct SL * next;
+  GtkWidget * treeview;
+  GtkWidget * searchpage;
+  struct ECRS_URI * uri;
+} SearchList;
+
+static SearchList * head;
+
+static GtkListStore * summary;
+
+/**
+ * Recursively free the (internal) model data fields
+ * (uri and meta) from the search tree model.
+ */ 
+static void freeIterSubtree(GtkTreeModel * tree,
+                           GtkTreeIter * iter) {
+  GtkTreeIter child;
+  struct ECRS_URI * uri;
+  struct ECRS_MetaData * meta;
+
+  do {
+    uri = NULL;
+    meta = NULL;
+    gtk_tree_model_get(tree,
+                      iter,
+                      5, &uri,
+                      6, &meta,
+                      -1);
+    if (uri != NULL)
+      ECRS_freeUri(uri);
+    if (meta != NULL)
+      ECRS_freeMetaData(meta);
+    gtk_tree_store_set(GTK_TREE_STORE(tree),
+                      iter,
+                      5, NULL,
+                      6, NULL,
+                      -1);
+    if (gtk_tree_model_iter_children(tree,
+                                    &child,
+                                    iter))
+      freeIterSubtree(tree, &child);
+  } while (gtk_tree_model_iter_next(tree,
+                                   iter));
+    
+                                
+}
+
+void on_searchResults_destroy(GtkWidget * dummy,
+                             GtkWidget * treeview) {
+  GtkTreeStore * tree;
+  GtkTreeIter iter;
+  
+  tree = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)));
+  if (! gtk_tree_model_get_iter_first(GTK_TREE_MODEL(tree),
+                                     &iter))
+    return; /* tree empty */
+  freeIterSubtree(GTK_TREE_MODEL(tree),
+                 &iter);
+}
+
+/**
+ * Add the given result to the model (search result
+ * list).
+ * @param info the information to add to the model
+ * @param treeview the page from which to obtain the model
+ * @param path the tree path that selects where to add
+ *        the information
+ */
+static void addSearchResultToModel(const ECRS_FileInfo * info,
+                                  GtkWidget * treeview,
+                                  GtkTreeRowReference * row) {
+  GtkTreeStore * model;
+  GtkTreeIter iter;
+  GtkTreeIter parent;
+  GtkTreeIter * pparent;
+  GtkTreePath * path;
+  unsigned long long size;
+  char * name;
+  char * mime;
+  char * desc;
+  unsigned char * thumb;
+  size_t ts;
+  GdkPixbuf * pixbuf;
+  GdkPixbufLoader * loader;
+
+  if (! gtk_tree_row_reference_valid(row))
+    path = NULL;
+  else
+    path = gtk_tree_row_reference_get_path(row);
+  model = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(treeview))); 
+  if (path != NULL) {
+    gtk_tree_model_get_iter(GTK_TREE_MODEL(model),
+                           &parent,
+                           path);
+    pparent = &parent;
+  } else      
+    pparent = NULL;
+  gtk_tree_store_insert(model,
+                       &iter,
+                       pparent,
+                       0);
+  mime = ECRS_getFromMetaData(info->meta,
+                             EXTRACTOR_MIMETYPE);
+  if (mime == NULL)
+    mime = STRDUP(_("unknown"));
+  desc = ECRS_getFirstFromMetaData(info->meta,
+                                  EXTRACTOR_DESCRIPTION,
+                                  EXTRACTOR_GENRE,
+                                  EXTRACTOR_ALBUM,
+                                  EXTRACTOR_COMMENT,
+                                  EXTRACTOR_SUBJECT,
+                                  EXTRACTOR_FORMAT,
+                                  EXTRACTOR_SIZE,
+                                  EXTRACTOR_KEYWORDS,
+                                  -1);
+  if (desc == NULL)
+    desc = STRDUP(_(""));
+  name = ECRS_getFirstFromMetaData(info->meta,
+                                  EXTRACTOR_FILENAME,
+                                  EXTRACTOR_TITLE,
+                                  EXTRACTOR_ARTIST,
+                                  EXTRACTOR_AUTHOR,
+                                  EXTRACTOR_PUBLISHER,
+                                  EXTRACTOR_CREATOR,
+                                  EXTRACTOR_PRODUCER,
+                                  EXTRACTOR_UNKNOWN,
+                                  -1);
+  if (name == NULL)
+    name = STRDUP(_("no name given")); 
+  size = ECRS_fileSize(info->uri);
+  thumb = NULL;
+  ts = ECRS_getThumbnailFromMetaData(info->meta,
+                                    &thumb);
+  if (ts != 0) {
+    loader = gdk_pixbuf_loader_new();
+    gdk_pixbuf_loader_write(loader,
+                           (const guchar*) thumb,
+                           ts,
+                           NULL);    
+    pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
+    gdk_pixbuf_loader_close(loader,
+                           NULL);
+  } else {
+    pixbuf = NULL;
+  }
+  gtk_tree_store_set(model,
+                    &iter,
+                    0, name,
+                    1, size,
+                    2, mime,
+                    3, desc,
+                    4, pixbuf,
+                    5, ECRS_dupUri(info->uri),
+                    6, ECRS_dupMetaData(info->meta),
+                    7, NULL, /* internal */
+                    -1);
+  FREE(mime);
+  FREE(desc);
+  FREE(name);
+  FREENONNULL(thumb);
+}
+
+/**
+ * Add the given result to the model (search result
+ * list).
+ * @param info the information to add to the model
+ * @param uri the search URI
+ * @param path the tree path that selects where to add
+ *        the information, NULL for top-level
+ */
+void displaySearchResult(const ECRS_FileInfo * info,
+                        const struct ECRS_URI * uri,
+                        GtkTreeRowReference * row) {  
+  SearchList * list;
+
+  list = head;
+  while (list != NULL) {
+    if (ECRS_equalsUri(list->uri,
+                      uri))
+      break;
+    list = list->next;
+  }
+  if (list == NULL) {
+    BREAK();
+    return;
+  }
+  addSearchResultToModel(info,
+                        list->treeview,
+                        row);
+}
+
+void on_closeSearchButton_clicked(GtkWidget * searchPage,
+                                 GtkWidget * closeButton) {
+  GtkWidget * notebook;
+  int index;
+  int i;
+  struct ECRS_URI * uri;
+  SearchList * list;
+  SearchList * prev;
+
+  list = head;
+  prev = NULL;
+  while (list != NULL) {
+    if (list->searchpage == searchPage)
+      break;
+    prev = list;
+    list = list->next;
+  }
+  GNUNET_ASSERT(list != NULL);
+  uri = list->uri;
+  FSUI_stopSearch(ctx,
+                 uri);
+  ECRS_freeUri(uri);
+  if (prev == NULL)
+    head = list->next;
+  else
+    prev->next = list->next;
+  FREE(list);
+  
+  notebook
+    = glade_xml_get_widget(mainXML,
+                          "downloadNotebook");
+  index = -1;
+  for (i=gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook))-1;i>=0;i--)
+    if (searchPage == gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
+                                               i))
+      index = i;
+
+  if (index != -1) {
+    gtk_notebook_remove_page(GTK_NOTEBOOK(notebook),
+                            index);
+  } else {
+    BREAK();
+  }
+}
+
+static GtkWidget * makeResultFrame(GtkWidget ** treeview) {
+  GtkWidget * window;
+  GtkWidget * child;
+  GtkWidget * resultList;
+  GtkCellRenderer * renderer;
+  GtkTreeStore * tree;
+  GladeXML * searchXML;
+
+  searchXML
+    = glade_xml_new(GLADE_FILE,
+                   "searchResultsFrame", 
+                   NULL);
+  glade_xml_signal_autoconnect(searchXML);
+  window = glade_xml_get_widget(searchXML,
+                              "searchResultsFrame");
+  resultList = glade_xml_get_widget(searchXML,
+                                   "searchResults");
+  if (treeview != NULL)
+    (*treeview) = GTK_WIDGET(GTK_TREE_VIEW(resultList));
+  tree =
+    gtk_tree_store_new(8,
+                      G_TYPE_STRING, /* name */
+                      G_TYPE_UINT64,  /* size */
+                      G_TYPE_STRING, /* mime-type */                        
+                      G_TYPE_STRING, /* meta-data (some) */                    
     
+                      GDK_TYPE_PIXBUF, /* preview */                        
+                      G_TYPE_POINTER,  /* url */
+                      G_TYPE_POINTER,  /* meta */
+                      G_TYPE_POINTER); /* internal: download info/NULL */
+  gtk_tree_view_set_model(GTK_TREE_VIEW(resultList),
+                         GTK_TREE_MODEL(tree));
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
+                                             -1,
+                                             _("Name"),
+                                             renderer,
+                                             "text", 0, 
+                                             NULL);
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
+                                             -1,
+                                             _("Size"),
+                                             renderer,
+                                             "text", 1,
+                                             NULL);
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
+                                             -1,
+                                             _("Mime-type"),
+                                             renderer,
+                                             "text", 2,
+                                             NULL);
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
+                                             -1,
+                                             _("Meta-data"),
+                                             renderer,
+                                             "text", 3,
+                                             NULL);
+  renderer = gtk_cell_renderer_pixbuf_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
+                                             -1,
+                                             _("Preview"),
+                                             renderer,
+                                             "pixbuf", 4,
+                                             NULL);
+  child = gtk_bin_get_child(GTK_BIN(window));
+  gtk_widget_ref(GTK_WIDGET(child));
+  gtk_container_remove(GTK_CONTAINER(window),
+                      child);
+  gtk_widget_destroy(window);
+  UNREF(searchXML);
+
+  return child;
+}
+
+void on_fssearchbutton_clicked(gpointer dummy2,
+                              GtkWidget * searchButton) {
+  GtkWidget * searchKeywordGtkCB;
+  GtkWidget * searchNamespaceGtkCB;
+  GtkWidget * notebook;
+  GtkWidget * page;
+  GtkWidget * label;
+  GtkWidget * entry;
+  GtkListStore * model;
+  GtkTreeIter iter;
+  struct ECRS_URI * uri;
+  const char * ss;
+  const char * ns;
+  gint pages;
+  gint i;
+  char * tabtxt;
+  SearchList * list;
+
+  searchKeywordGtkCB
+    = glade_xml_get_widget(mainXML,
+                          "fssearchKeywordComboBoxEntry");
+  entry = gtk_bin_get_child(GTK_BIN(searchKeywordGtkCB));
+  ss = gtk_entry_get_text(GTK_ENTRY(entry));
+  if (ss == NULL) {
+    LOG(LOG_ERROR,
+       "Need a keyword to search!\n");
+    return;
+  }
+  i = gtk_combo_box_get_active(GTK_COMBO_BOX(searchKeywordGtkCB));
+  if (i == -1) {
+    model = 
GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(searchKeywordGtkCB)));
+    gtk_list_store_prepend(model,
+                          &iter);
+    gtk_list_store_set(model,
+                      &iter,
+                      0,
+                      ss,
+                      -1);
+  }
+
+  searchNamespaceGtkCB
+    = glade_xml_get_widget(mainXML,
+                          "searchNamespaceComboBoxEntry");
+  entry = gtk_bin_get_child(GTK_BIN(searchNamespaceGtkCB));
+  ns = gtk_entry_get_text(GTK_ENTRY(entry));
+  if ( (ns != NULL) &&
+       (0 == strcmp(ns,
+                   _("globally"))) )
+    ns = NULL;
+  ns = NULL; /* FIXME! */
+  if (ns != NULL) {    
+    /* FIXME */
+  } else {
+    uri = FSUI_parseCharKeywordURI(ss);   
+  }
+  if (uri == NULL)
+    return;
+  if (ns == NULL) {
+    tabtxt = STRDUP(ss);
+  } else {
+    tabtxt = MALLOC(strlen(ss) + strlen(ns) + 2);
+    SNPRINTF(tabtxt,
+            strlen(ss) + strlen(ns) + 2,
+            "%s/%s",
+            ns,
+            ss);
+  }
+  notebook
+    = glade_xml_get_widget(mainXML,
+                          "downloadNotebook");
+  list = head;
+  pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook));
+  while (list != NULL) {
+    if (ECRS_equalsUri(list->uri,
+                      uri)) {      
+      for (i=0;i<pages;i++) {
+       page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
+                                        i);
+       if (page == list->searchpage) {
+         gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook),
+                                       i);
+         ECRS_freeUri(uri);
+         FREE(tabtxt);
+         return;
+       }
+      }
+      BREAK();
+    }
+    list = list->next;
+  }
+  list
+    = MALLOC(sizeof(SearchList));
+  list->searchpage
+    = makeResultFrame(&list->treeview);
+  list->next 
+    = head;
+  list->uri
+    = uri;
+  head = list;
+  label = gtk_label_new(tabtxt);
+  gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+                          list->searchpage,
+                          label);
+  gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook),
+                               pages);
+  gtk_widget_show(notebook);
+  /* FIXME (later):
+     add widget to allow anonymity level specification! */
+  FSUI_startSearch(ctx,
+                  getConfigurationInt("GNUNET-GTK",
+                                      "ANONYMITY-LEVEL"),
+                  uri);
+  FREE(tabtxt);
+}
+
+static int addNamespace(GtkListStore * model,
+                       const char * namespaceName,
+                       const HashCode512 * namespaceId,
+                       const struct ECRS_MetaData * md,
+                       int rating) {
+  GtkTreeIter iter;
+  EncName enc;
+  char * name;
+  
+  hash2enc(namespaceId,
+          &enc);
+  name = MALLOC(strlen(namespaceName) + sizeof(EncName) + 2);
+  SNPRINTF(name,
+          strlen(namespaceName) + sizeof(EncName) + 2,
+          "%s: %s",
+          &enc,
+          namespaceName);
+  gtk_list_store_append(model,
+                       &iter);
+  gtk_list_store_set(model,
+                    &iter,
+                    0,
+                    name,
+                    -1);
+  FREE(name);               
+  return OK;
+}
+
+/**
+ * cron job that periodically updates the model for the
+ * namespace selection in the search vbox.
+ */
+static gint updateNCBModelSafe(SaveCall * call) {
+  GtkWidget * searchNamespaceCB;
+  GtkListStore * model;
+  GtkTreeIter iter;
+ 
+  model = gtk_list_store_new(1, G_TYPE_STRING);
+  gtk_list_store_append(model,
+                       &iter);
+  gtk_list_store_set(model,
+                    &iter,
+                    0, _("globally"),
+                    -1);
+  FSUI_listNamespaces(ctx,
+                     NO,
+                     (FSUI_NamespaceIterator)&addNamespace,
+                     model);
+  searchNamespaceCB
+    = glade_xml_get_widget(mainXML,
+                          "searchNamespaceComboBoxEntry");
+  gtk_combo_box_set_model(GTK_COMBO_BOX(searchNamespaceCB),
+                         GTK_TREE_MODEL(model));
+  gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(searchNamespaceCB),
+                                     0);
+  if (-1 == gtk_combo_box_get_active(GTK_COMBO_BOX(searchNamespaceCB)))
+    gtk_combo_box_set_active(GTK_COMBO_BOX(searchNamespaceCB),
+                            0);
+  gtkSaveCallDone(call->sem);
+  return FALSE;
+}
+
+static void updateNCBModel(void * call) {
+  gtkSaveCall((GtkFunction) updateNCBModelSafe, NULL);
+}
+
+/**
+ * Open a tab for the given search
+ * (and display the results).
+ */
+static int openTabForSearch(void * unused,
+                           const struct ECRS_URI * uri,
+                           unsigned int anonymityLevel,
+                           unsigned int resultCount,
+                           const ECRS_FileInfo * results) {
+  SearchList * list;
+  char * description;
+  char * dhead;
+  GtkWidget * label;
+  GtkWidget * notebook;
+  GtkTreeStore * model;
+  GtkTreeIter iter;
+  int i;
+
+  description = ECRS_uriToString(uri);
+  if (description == NULL) {
+    BREAK();
+    return SYSERR;
+  }
+  GNUNET_ASSERT(strlen(description) >= strlen(ECRS_URI_PREFIX));
+  dhead = &description[strlen(ECRS_URI_PREFIX)];
+  if (0 == strncmp(dhead,
+                  ECRS_SEARCH_INFIX,
+                  strlen(ECRS_SEARCH_INFIX)))
+    dhead = &dhead[strlen(ECRS_SEARCH_INFIX)];
+  else if (0 == strncmp(dhead,
+                       ECRS_SUBSPACE_INFIX,
+                       strlen(ECRS_SUBSPACE_INFIX)))
+    dhead = &dhead[strlen(ECRS_SUBSPACE_INFIX)];    
+  label = gtk_label_new(dhead);
+
+  gtk_list_store_append(summary,
+                       &iter);
+  gtk_list_store_set(summary,
+                    &iter,
+                    0, dhead,
+                    1, resultCount,
+                    2, ECRS_dupUri(uri),
+                    -1);
+
+  FREE(description);
+  list = MALLOC(sizeof(SearchList));
+  list->uri = ECRS_dupUri(uri);
+  list->next = head;
+  list->searchpage
+    = makeResultFrame(&list->treeview);
+  notebook
+    = glade_xml_get_widget(mainXML,
+                          "downloadNotebook");
+  gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+                          list->searchpage,
+                          label);
+  gtk_widget_show(notebook);
+  head = list;
+  model = 
GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list->treeview)));
+  for (i=0;i<resultCount;i++) {
+    addSearchResultToModel(&results[i],
+                          list->treeview,
+                          NULL);
+  }
+  return OK;
+}
+
+
+void fs_search_start() {
+  GtkWidget * searchCB;
+  GtkListStore * model;
+  GtkWidget * searchList;
+  GtkCellRenderer * renderer;
+
+  searchCB
+    = glade_xml_get_widget(mainXML,
+                          "fssearchKeywordComboBoxEntry");
+
+  model = gtk_list_store_new(1, G_TYPE_STRING);
+  gtk_combo_box_set_model(GTK_COMBO_BOX(searchCB),
+                         GTK_TREE_MODEL(model));
+  gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(searchCB),
+                                     0);
+  addCronJob(&updateNCBModel,
+            0,
+            5 * cronMINUTES,
+            NULL);
+
+  searchList = glade_xml_get_widget(mainXML,
+                                   "activeSearchesSummary");
+  summary =
+    gtk_list_store_new(3,
+                      G_TYPE_STRING, /* name */
+                      G_TYPE_INT,    /* # results */
+                      G_TYPE_POINTER);  /* internal: uri */
+  gtk_tree_view_set_model(GTK_TREE_VIEW(searchList),
+                         GTK_TREE_MODEL(summary));
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(searchList),
+                                             -1,
+                                             _("Query"),
+                                             renderer,
+                                             "text", 0,
+                                             NULL);
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(searchList),
+                                             -1,
+                                             _("Results"),
+                                             renderer,
+                                             "text", 1,
+                                             NULL);
+
+  FSUI_listSearches(ctx,
+                   &openTabForSearch,
+                   NULL);
+}
+
+void fs_search_stop() {
+  SearchList * list;
+
+  delCronJob(&updateNCBModel,
+            5 * cronMINUTES,
+            NULL);
+  while (head != NULL) {
+    list = head;
+    head = head->next;
+    ECRS_freeUri(list->uri);
+    FREE(list);
+  }
+  
+}
+
+/* end of search.c */

Added: gnunet-gtk/src/search.h
===================================================================
--- gnunet-gtk/src/search.h     2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/search.h     2005-06-02 15:05:35 UTC (rev 843)
@@ -0,0 +1,50 @@
+/*
+     This file is part of GNUnet.
+     (C) 2005 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 2, 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 src/search.h
+ * @brief code for searching with gnunet-gtk
+ * @author Christian Grothoff
+ */
+
+#ifndef GTK_SEARCH_H
+#define GTK_SEARCH_H
+
+#include "main.h"
+#include "fs.h"
+
+/**
+ * Add the given result to the model (search result
+ * list).
+ * @param info the information to add to the model
+ * @param uri the search URI
+ * @param path the tree path that selects where to add
+ *        the information, NULL for top-level
+ */
+void displaySearchResult(const ECRS_FileInfo * info,
+                        const struct ECRS_URI * uri,
+                        GtkTreeRowReference * row);
+
+
+void fs_search_start(void);
+
+void fs_search_stop(void);
+
+#endif

Added: gnunet-gtk/src/upload.c
===================================================================
--- gnunet-gtk/src/upload.c     2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/upload.c     2005-06-02 15:05:35 UTC (rev 843)
@@ -0,0 +1,305 @@
+/*
+     This file is part of GNUnet.
+     (C) 2005 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 2, 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 src/upload.c
+ * @brief code for uploading with gnunet-gtk
+ * @author Christian Grothoff
+ */
+
+#include "platform.h"
+#include "search.h"
+#include "helper.h"
+#include <extractor.h>
+
+
+static GtkTreeStore * summary;
+
+
+/**
+ */
+void displayUploadUpdate(const char * mainName,
+                        const char * filename,
+                        unsigned long long completed,
+                        unsigned long long total) {
+}
+
+/**
+ */
+void displayUploadComplete(const char * mainName,
+                          const char * filename,
+                          const struct ECRS_URI * uri) {
+}
+
+
+static int publishMetaData(EXTRACTOR_KeywordType type,
+                          const char * data,
+                          GtkListStore * store) {
+  const char * stype;
+  GtkTreeIter iter;
+
+  stype = EXTRACTOR_getKeywordTypeAsString(type);
+  gtk_list_store_append(store,
+                       &iter);
+  gtk_list_store_set(store,
+                    &iter,
+                    0, type,
+                    1, stype,
+                    2, data,
+                    -1);
+  return OK;
+}
+
+static int publishKeyword(const char * data,
+                         GtkListStore * store) {
+  GtkTreeIter iter;
+
+  gtk_list_store_append(store,
+                       &iter);
+  gtk_list_store_set(store,
+                    &iter,
+                    0, data,
+                    -1);
+  return OK;
+}
+
+void on_fsinsertuploadbutton_clicked(GtkWidget * uploadButton,
+                                    gpointer dummy) {
+  const char * filename;
+  GladeXML * metaXML;
+  GtkWidget * uploadLine;
+  GtkWidget * metaList;
+  GtkWidget * keywordList;
+  GtkWidget * entry;
+  GtkWidget * dialog;
+  GtkWidget * metaType;
+  GtkCellRenderer * renderer;
+  GtkListStore * metamodel;
+  GtkListStore * keymodel;
+  GtkListStore * keywordTypeModel;
+  struct ECRS_MetaData * meta;
+  EXTRACTOR_ExtractorList * extractors;
+  EXTRACTOR_KeywordType type;
+  char * config;
+  struct ECRS_URI * keywordURI;
+  const char * stype;
+
+  extractors = EXTRACTOR_loadDefaultLibraries();
+  config = getConfigurationString("FS",
+                                 "EXTRACTORS");
+  if (config != NULL) {
+    extractors = EXTRACTOR_loadConfigLibraries(extractors,
+                                              config);
+    FREE(config);
+  }
+    
+  uploadLine = glade_xml_get_widget(mainXML,
+                                   "uploadFilenameComboBoxEntry");
+  entry = gtk_bin_get_child(GTK_BIN(uploadLine));
+  filename = gtk_entry_get_text(GTK_ENTRY(entry));
+  
+  metaXML
+    = glade_xml_new(GLADE_FILE,
+                   "metaDataDialog",
+                   NULL);
+  glade_xml_signal_autoconnect(metaXML);
+  dialog = glade_xml_get_widget(metaXML,
+                               "metaDataDialog");
+  metamodel
+    = gtk_list_store_new(3,
+                        G_TYPE_INT,
+                        G_TYPE_STRING,
+                        G_TYPE_STRING);
+  metaList = glade_xml_get_widget(metaXML,
+                                 "metaDataDialogMetaDataList");
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(metaList),
+                                             -1,
+                                             _("Category"),
+                                             renderer,
+                                             "text", 1,
+                                             NULL);
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(metaList),
+                                             -1,
+                                             _("Value"),
+                                             renderer,
+                                             "text", 2,
+                                             NULL);
+  gtk_tree_view_set_model(GTK_TREE_VIEW(metaList),
+                         GTK_TREE_MODEL(metamodel));
+
+
+  keymodel
+    = gtk_list_store_new(1,
+                       G_TYPE_STRING);
+  keywordList = glade_xml_get_widget(metaXML,
+                                    "metaDataDialogKeywordList");
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(keywordList),
+                                             -1,
+                                             _("Keyword"),
+                                             renderer,
+                                             "text", 0,
+                                             NULL);
+  gtk_tree_view_set_model(GTK_TREE_VIEW(keywordList),
+                         GTK_TREE_MODEL(keymodel));
+  meta = ECRS_createMetaData();
+  ECRS_extractMetaData(meta,
+                      filename,
+                      extractors);
+  ECRS_getMetaData(meta,
+                  (ECRS_MetaDataIterator) &publishMetaData,
+                  metamodel);
+  keywordURI = ECRS_metaDataToUri(meta);
+  ECRS_getKeywordsFromUri(keywordURI,
+                         (ECRS_KeywordIterator) &publishKeyword,
+                         keymodel);
+  keywordTypeModel
+    = gtk_list_store_new(2,
+                        G_TYPE_STRING,
+                        G_TYPE_INT);
+  metaType = glade_xml_get_widget(metaXML,
+                                 "metaDataDialogMetaTypeComboBox");
+  gtk_combo_box_set_model(GTK_COMBO_BOX(metaType),
+                         GTK_TREE_MODEL(keywordTypeModel));
+  for (type=0;type<EXTRACTOR_getHighestKeywordTypeNumber();type++) {   
+    GtkTreeIter iter;
+
+    stype = EXTRACTOR_getKeywordTypeAsString(type);    
+    gtk_list_store_append(keywordTypeModel,
+                         &iter);
+    gtk_list_store_set(keywordTypeModel,
+                      &iter,
+                      0, stype,
+                      1, type,
+                      -1); 
+  }
+  renderer = gtk_cell_renderer_text_new();
+  gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(metaType),
+                            renderer,
+                            FALSE);
+  gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(metaType),
+                               renderer,
+                               "text", 0);
+  gtk_combo_box_set_active(GTK_COMBO_BOX(metaType),
+                          0);
+  gtk_widget_show(dialog);
+  ECRS_freeMetaData(meta);
+  ECRS_freeUri(keywordURI);
+  if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL) {
+
+  }
+  UNREF(metaXML);
+}
+
+void on_mainFileSharingInsertBrowseButton_clicked(GtkWidget * browseButton,
+                                                 gpointer dummy) {
+  GtkWidget *dialog;
+  GladeXML * uploadXML;
+  GtkWidget * uploadLine;
+  GtkWidget * entry;
+  GtkListStore * model;
+  GtkTreeIter iter;
+
+  uploadXML
+    = glade_xml_new(GLADE_FILE,
+                   "uploadfilechooserdialog",
+                   NULL);
+  glade_xml_signal_autoconnect(uploadXML);
+  dialog = glade_xml_get_widget(uploadXML,
+                               "uploadfilechooserdialog");
+  /* 
+     FIXME:
+  if(recursive) 
+     gtk_file_chooser_set_action(GTK_FILE_CHOOSER(dialog),
+                             GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+  */
+  if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL) {
+    char *filename;
+    
+    filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+    uploadLine = glade_xml_get_widget(mainXML,
+                                     "uploadFilenameComboBoxEntry");
+    entry = gtk_bin_get_child(GTK_BIN(uploadLine));
+    gtk_entry_set_text(GTK_ENTRY(entry),
+                      filename);
+    model = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(uploadLine)));
+    gtk_list_store_prepend(model,
+                          &iter);
+    gtk_list_store_set(model,
+                      &iter,
+                      0,
+                      filename,
+                      -1);
+    g_free (filename);
+  }
+  gtk_widget_destroy (dialog);
+  UNREF(uploadXML);
+}
+
+
+void fs_upload_start() {
+  GtkWidget * uploadList;
+  GtkWidget * uploadEntry;
+  GtkCellRenderer * renderer;
+  GtkListStore * model;
+
+  uploadList = glade_xml_get_widget(mainXML,
+                                   "activeUploadsList");
+  summary =
+    gtk_tree_store_new(3,
+                      G_TYPE_STRING, /* filename */
+                      G_TYPE_INT,    /* progress */
+                      G_TYPE_STRING);  /* URI (as string) - after completion */
+  gtk_tree_view_set_model(GTK_TREE_VIEW(uploadList),
+                         GTK_TREE_MODEL(summary));
+  renderer = gtk_cell_renderer_progress_new();  
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(uploadList),
+                                             -1,
+                                             _("Filename"),
+                                             renderer,
+                                             "text", 0,
+                                             "value", 1,
+                                             NULL);
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(uploadList),
+                                             -1,
+                                             _("URI"),
+                                             renderer,
+                                             "text", 2,
+                                             NULL);
+
+
+  uploadEntry
+    = glade_xml_get_widget(mainXML,
+                          "uploadFilenameComboBoxEntry");
+
+  model = gtk_list_store_new(1, G_TYPE_STRING);
+  gtk_combo_box_set_model(GTK_COMBO_BOX(uploadEntry),
+                         GTK_TREE_MODEL(model));
+  gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(uploadEntry),
+                                     0);
+
+}
+
+void fs_upload_stop() {
+}
+
+/* end of upload.c */

Added: gnunet-gtk/src/upload.h
===================================================================
--- gnunet-gtk/src/upload.h     2005-06-02 05:39:28 UTC (rev 842)
+++ gnunet-gtk/src/upload.h     2005-06-02 15:05:35 UTC (rev 843)
@@ -0,0 +1,65 @@
+/*
+     This file is part of GNUnet.
+     (C) 2005 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 2, 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 src/upload.h
+ * @brief code for uploading with gnunet-gtk
+ * @author Christian Grothoff
+ */
+
+#ifndef GTK_UPLOAD_H
+#define GTK_UPLOAD_H
+
+#include "main.h"
+#include "fs.h"
+
+/**
+ */
+void displayUploadUpdate(const char * mainName,
+                        const char * filename,
+                        unsigned long long completed,
+                        unsigned long long total);
+
+/**
+ */
+void displayUploadComplete(const char * mainName,
+                          const char * filename,
+                          const struct ECRS_URI * uri);
+
+
+
+/**
+ * Add the given result to the model (upload result
+ * list).
+ * @param info the information to add to the model
+ * @param uri the upload URI
+ * @param path the tree path that selects where to add
+ *        the information, NULL for top-level
+ */
+void displayUploadResult(const ECRS_FileInfo * info,
+                        const struct ECRS_URI * uri,
+                        GtkTreeRowReference * row);
+
+
+void fs_upload_start(void);
+
+void fs_upload_stop(void);
+
+#endif





reply via email to

[Prev in Thread] Current Thread [Next in Thread]