gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r1572 - GNUnet-docs/WWW


From: grothoff
Subject: [GNUnet-SVN] r1572 - GNUnet-docs/WWW
Date: Sun, 17 Jul 2005 11:36:22 -0700 (PDT)

Author: grothoff
Date: 2005-07-17 11:36:19 -0700 (Sun, 17 Jul 2005)
New Revision: 1572

Removed:
   GNUnet-docs/WWW/namespace.php3
Log:
dead

Deleted: GNUnet-docs/WWW/namespace.php3
===================================================================
--- GNUnet-docs/WWW/namespace.php3      2005-07-17 12:24:55 UTC (rev 1571)
+++ GNUnet-docs/WWW/namespace.php3      2005-07-17 18:36:19 UTC (rev 1572)
@@ -1,310 +0,0 @@
-<?php
-include("scripts.php3");
-$title = "GNUnet Subspaces and Directories";
-$description = "Page for the discussion of how to implement private subspaces 
and directories in GNUnet.";
-include("html_header.php3");
-// FIXME: update for 0.7.0?
-H2("Subspaces and Directories in GNUnet");
-
-BP();
-
-W("Please note that this document reflects the discussion before the actual 
implementation of namespaces and directories.");
-W("The final implementation is documented elsewhere.");
-W("Nevertheless, almost everything written here still applies.");
-W("Still, some of what is written here outdated at this point.");
-W("This page is preserved primarily for historical purposes.");
-
-EP();
-
-H3("Introduction");
-
-BP();
-W("The goal of this proposal is to allow an author <i>A</i> to publish lists 
of) files and their CHKs, along with metadata (file descriptions), such that 
that:");
-EP();
-
-echo "<ol><li>";
-W("no malicious user <i>M</i> is be able to publish as <i>A</i>, and");
-echo "</li><li>";
-W("searches for content provided by <i>A</i> must never be matched by any 
other content.");
-echo "</li></ol>";
-
-BP();
-W("<strong>Proposition:</strong> Use author specific queries, called 
<em>SQueries</em>, that only return <em>SBlocks</em> (blocks that were 
cryptographically signed by the author).");
-W("The SBlocks contain a (list of) signed CHK keys that can then be used to 
retrieve a <em>Directory</em>.");
-W("A directory is a file that contains meta-data for a list of files in a 
standardized format.");
-W("The metadata can then be used to retrieve the actual files.");
-EP();
-
-H3("GNUnet AFS subspaces");
-
-BP();
-W("In order to create a new subspace, an author must first create a 
public-private key pair.");
-W("We will refer to this key pair as the <em>pseudonym</em> of the author.");
-W("Every author can create any number of pseudonyms.");
-W("The hash of the public key is used as the <em>subspace identifier</em>.");
-W("Every inserted SBlock in the subspace carries a cryptographic signature to 
prove that it is actually a valid block in the subspace.");
-P();
-
-W("Whenever an SBlock is transported via a node, the peer verifies the 
signature and drops the block if the signature is invalid.");
-W("In order to ensure that peers can check the signature without any 
additional information, the public key of the author must be included in the 
SBlock.");
-W("Peers never store or transmit SBlocks that do not pass the signature 
check.");
-W("Peers never give credit for SBlocks with invalid signatures.");
-
-EP();
-H4("Format of an SBlock");
-
-BP();
-W("The format of an SBlock is intended to fit within the general format of 
search-results.");
-W("But where the search-results contain the filename, description and 
mime-type, the SBlock must provide the signature and the public key.");
-W("Content in the subspace is identified by SBlocks that have the following 
format:");
-
-EP();
-PRE("typedef struct {\n" .
-    "  unsigned short SBLOCK_MAGIC;\n" .
-    "  unsigned short SBLOCK_VERSION; \n" .
-    "  FileIdentifier fileIdentifier; /* 48 b */\n" .
-    "  char description[MAX_DESC_LEN]; /* 256 b */\n" .
-    "  char filename[MAX_FILENAME_LEN/2]; /* 64 b */\n" .
-    "  char mimetype[MAX_MIMETYPE_LEN/2]; /* 64 b */\n" .
-    "  time_t creationTime;\n" .
-    "  time_t updateInterval;\n" .
-    "  HashCode160 nextIdentifier; /* N, 20 b */\n" .
-    "  HashCode160 identifierIncrement; /* I, 20 b */\n" .
-    "  HashCode160 hash_of_sblock_identifier; /* = R, 20 b */\n" .
-    "  Signature signature; /* 256 b */\n" .
-    "  PublicKey subspace; /* 264 b */\n" .
-    "} SBlock; /* total: 1024 bytes */");
-BP();
-
-W("In the SBlock, the <em>signature</em> is the RSA signature of 
<tt>H(E<sub>K</sub>(MAGIC, fileIdentifier, description, filename, mimetype, 
creationTime, updateInterval, nextIdentifier, identifierIncrement))</tt>.");
-W("The SBlock is transmitted with the data portion being encrypted, thus we 
must sign the encrypted data such that intermediaries can verify the 
signature.");
-W("We will denote the encrypted portion of the SBlock, the first 488 bytes, as 
<tt>SBlock<sub>488</sub></tt>.");
-W("The SBlock is encrypted with a key <tt>K</tt> which is chosen by the 
user.");
-W("A typically way for the user to specify <tt>K</tt> is to provide a keyword 
and then <tt>K = H(&quot;keyword&quot;)</tt>.");
-W("The key <tt>K</tt> is explicitly stored in the encrypted portion of the 
SBlock since <tt>K = N - I</tt>.");
-W("SBlocks are stored in plaintext in directories, thus it is important that 
the encryption key <tt>K</tt> can be recovered.");
-W("For routing purposes, we use <tt>R = H(K) ^ S</tt>.");
-W("The XOR operation with the subspace identifier <tt>S = H(PubKey)</tt> is 
used to avoid collisions with the same key(word) in other subspaces in the 
routing table.");
-W("The signature and the subspace key (which will always be transmitted in 
plaintext) will be denoted as <tt>SBlock<sub>R, sig</sub></tt>.");
-W("The signature is always applied to the encrypted SBlock.");
-W("Every peer transmitting an SBlock must check that the signature is correct 
with respect to the public key and that the public key and the identifier match 
the SQuery.");
-W("The <tt>SBLOCK_VERSION</tt> is used to specify if the file identified by 
the <tt>fileIdentifier</tt> is a directory or a normal file.");
-P();
-W("The <tt>creationTime</tt> and <tt>updateInterval</tt> entries allow clients 
to detect outdated content or signatures.");
-W("If the <tt>creationTime</tt> is 0, the <tt>updateInterval</tt> specifies 
<em>how long</em> the signature is valid (if <tt>updateInterval</tt> is also 0, 
this means <em>forever</em>).");
-W("Otherwise, the <tt>creationTime</tt> specifies when this block was 
created.");
-W("In that case, the creator can specify that after <tt>updateInterval</tt> 
seconds an update will be made available under the identifier 
<tt>nextIdentifier</tt> (if <tt>updateInterval</tt> is 0, no updates are going 
to be made available).");
-W("If the <tt>updateInterval</tt> is -1, it means that this is not a periodic 
publication and that there will only be a single update under 
<tt>nextIdentifier</tt> at an arbitrary point in time.");
-W("If periodic updates are announced (both timers non-zero and not minus one), 
the <tt>nextIdentifier</tt> is the presumed identifier for the updated content 
that is available at <tt>creationTime + updateInterval</tt>.");
-W("If (for each of the 5 integers of HashCode160) <tt>nextIdentifier (N) = 
identifier (K) + identifierIncrement (I)</tt>, then the updates are made 
available periodically and the most recent available version has the identifier 
<tt>identifier (K) + identifierIncrement (I) * ((now - creationTime) / 
updateInterval)</tt>.");
-
-EP();
-HR();
-BP();
-H5("Example:");
-BP();
-W("Suppose the creation time is 400 and the update interval is 60.");
-W("If then the identifier is the tuple (64, 236, 34, 63, 723) and the next 
identifier is (65, 268, 37, 67, 721) and the identifier increment is (1, 2, 3, 
4, -2) the identifer from the time 520 to the time 579 will be computed to be 
the identifier plus 2 times the increment, which yields (66, 240, 40, 71, 
719).");
-W("Note that the numbers in practice will be much larger.");
-W("If in the addition any of the 5 integers overflows, the overflow is not 
carried over to the next integer but simply ignored.");
-EP();
-HR();
-BP();
-
-W("A <em>FileIdentifier</em> is a struct that contains the information 
required to download a file, or more specifially a GNUnet CHK, filesize and a 
CRC.");
-
-EP();
-PRE("typedef struct {\n" .
-    "CHK_Hashes chk;\n" .
-    "size_t file_length;\n" .
-    "int crc;\n" .
-    "} FileIdentifier; /* total: 48 bytes */\n");
-
-H5("Query example");
-
-/*
-[ It is probably a good idea to allow two types of queries:
-
-SQuery(subspace)
-   => match e.g. *.A439SBCKF832JFE84KDF0359DFLEWLKRKW353
-
-which would be matching every SBlock inserted to this subspace,
-regardless of identifier, and ]
-*/
-
-BP();
-W("Query for");
-EP();
-
-PRE("gnunet://afs/subspace/identifier\n" .
-    "=> SQuery(subspace,identifier)\n" .
-    "=> match e.g. 
&quot;A439SBCKF832JFE84KDF0359DFLEWLKRKW353,H(&rsquo;somestring.html&rsquo;)&quot;");
-
-BP();
-W("returns exactly matching SBlocks.");
-W("However, this scheme does not prevent the author from inserting multiple 
different SBlocks with same subspace-identifier pair.");
-W("On the network, the identifier will always be a hash code.");
-W("If the author provides a specific string, the hash of that string is 
used.");
-W("Otherwise, the identifier can be generated by computing H(H(content)), and 
presenting H(content) for user as the identifier part, which will be hashed 
again when used.");
-EP();
-
-/* [ Other option would be to have a different URL prefix for strings and 
hashes. ] */
-H4("Economy");
-
-BP();
-W("Because nodes have to verify the passing SBlocks, these requests should be 
made a bit more expensive.");
-W("Peers should never credit other peers that forward invalid blocks, thereby 
making it so that it is in the best interest of every peer to check the 
signature before wasting bandwidth or storage space on it.");
-EP();
-
-H3("GNUnet AFS directories");
-
-BP();
-W("A GNUnet directory is a standardized format of a file containing 
information about multiple files.");
-W("Like normal files, directories can be found with a search that returns 
either an SBlock (with the directory bit set) or a variant of the RootNode 
where also a bit in the minor version is changed to indicate that the file is a 
directory.");
-EP();
-
-H4("Format of directory files");
-
-BP();
-W("The format of the directory files is a sequence of 1k blocks each 
containing either a RootNode or an SBlock (which are always padded to 1k).");
-W("Other meta-block types may be defined in the future.");
-W("The directory file starts with one special 1k block of the following 
format:");
-
-EP();
-PRE("typedef struct {" .
-    "  char[8] MAGIC;   /* &quot;\211GND\\r\\n\\032\\n&quot; */\n" .   
-    "  int version; /* &quot;0000&quot; */\n" .        
-    "  int blockCount;   \n" .
-    "  char description[MAX_DESC_LEN]; /* 256 b */\n" .
-    "  char reserved[752]; /* padding to 1k */\n" .
-    "} DirectoryFileHeader; /* total: 1024 bytes */");
-BP();
-
-W("The blockCount is the number of 1k blocks that follow.");
-W("If the file is larger than 1024*(blockCount+1) the rest of the file is to 
be ignored by current clients and may be used for future extentions to the 
format.");
-P();
-
-W("This <em>Directory</em> is inserted to the network as a regular file, with 
keywords, directory name and description as specified by the inserter.");
-W("The mime-type of a directory should probably be 
<tt>application/gnunet-directory</tt>, but we should verify this against the 
mime-specifications to be on the safe side.");
-W("SBlock information can be added to a directory separately.");
-W("The mime-type does not need to be stored explicitly since the MAGIC code 
and the version identify the file type.");
-
-EP();
-H3(" Storing and retrieving data ");
-
-H4("Inserting");
-BP();
-W("To insert several files, protected via subspace");
-EP();
-echo "<ol><li>\n";
-W("Insert all files regularly (keys optional), and remember their 
RootNodeHeaders.");
-echo "</li><li>\n";
-W("Create and insert a list of previously inserted files as Directory using 
the RootNodeHeaders as its blocks");
-echo "</li><li>\n";
-W("Insert an SBlock pointing to the inserted Directory.");
-echo "</li></ol>\n";
-BP();
-W("Optionally, the Directory can also be inserted as a regular file under 
chosen keywords and with the appropriate meta-data.");
-
-EP();
-H4("Querying");
-
-BP();
-W("AFS clients should be able to distinguish between actual files, SBlocks and 
Directories using the type information stored in the Directory.");
-P();
-
-W("The AFS user interface should provide an easy-to-use interface for browsing 
SBlocks and Directory hierarchies.");
-
-EP();
-H3("Allowing pseudoupdateable content");
-
-BP();
-W("The subspace-directory scheme allows (pseudo) updateable content, as in 
Freenet.");
-W("Note that the need for these methods is diminished slightly if we allow for 
queries matching whole subspace.");
-
-EP();
-H3("Discussion");
-
-BP();
-W("Some remarks:");
-echo "<ul><li>";
-W("The subspace scheme allows meta-data of lists and files to be inserted 
preventing false insertions by third parties.");
-W("The directories themselves do not have to be protected as we can assume the 
adversary cannot forge a CHK.");
-W("The subspace suffices to protect all the files transitively.");
-echo "</li><li>";
-W("The actual SBlock request key should be formatted so that it can be cleanly 
used as part of an URL - anticipating a future web proxy application.");
-echo "</li><li>";
-W("We can never point to RootNodes that refer to future directories (its 
unlikely that we know the CHKs of the future directory today and a normal 3HASH 
reply block to a keyword query is insecure since anybody may insert data under 
that keyword).");
-W("What we can do is refer to a future SBlock by pre-setting its identifier.");
-W("We can even do this for a periodic publication by pre-defining a geometric 
function for the identifiers.");
-W("Thus, we can point to future SBlocks in an SBlock, but never to RootNodes 
or directly to future files.");
-echo "</li><li>";
-W("The Directory scheme allows posting of Directories under any search keys, 
without the subspace complication.");
-W("The returned meta-data block contains a special bit which will indicate 
that what the download will retrieve is not an ordinary file but a directory.");
-echo "</li></ul>";
-       
-H4("Questions and Answers");
-echo "<dl>\n";
-DT("How do we achieve deniability for the SBlocks?");
-echo "<dd>";
-W("The first 488 bytes of an SBlock should be encrypted using the 3HASH scheme 
(encrypt with the identifier I, search for H(I), reply is the tuple 
E<sub>I</sub>(SBlock<sub>488</sub>), and SBlock<sub>H(I), sig</sub> (the second 
half with the hash of the SBlock identifier, the public key and the signature 
must be in plaintext for verification).");
-W("Note that this encryption just prevents filtering of SBlocks based on 
plaintext keywords or file identifiers; the pseudonym and the query to match 
against must always be available in plaintext (to allow signature verification) 
and thus pseudonyms of well-known evildoers can always be censored by any 
well-meaning citizen.");
-W("Yet, the pointed-to content and the meta-data are both protected and as we 
know, every good evildoer will have lots of pseudonyms (RSA keys) available.");
-BR();BR();
-W("Also, an identifier <tt>I</tt> of the SBlock must be known to anybody 
searching for an SBlock since <tt>I</tt> is required to decrypt parts of the 
SBlock and H(I) forms, together with the hash of the pseudonym, the query.");
-W("The identifier of an SBlock is thus similar to the plaintext keyword for a 
3HASH query: it must be obtained out-of-band.");
-BR();
-/* [ This seems to prevent &rsquo;whole subspace match&rsquo; queries
-     that were defined in an earlier draft. Almost the same
-     could be achieved by author inserting duplicate (subspace,
-    identifier) pairs, only that then none of them could
-     be singled out individually. - IW ] */
-W("Just as for RootNodes, there may be multiple SBlocks with the same (SBlock) 
identifier pointing to different files as well as multiple SBlocks containing 
the same file identifier.");
-W("An SBlock search is only guaranteed to yield a unique result if the owner 
of the pseudonym only inserted one block under that identifier.");
-echo "</dd>\n";
-DT("Can we prevent nodes from censoring authgood, whose subspace string is 
well-known?");
-echo "<dd>";
-W("If peers censor the SBlocks of a pseudonym, the author can change the 
pseudonym.");
-W("The actual files (DBlocks, IBlocks and Directories) are not signed and thus 
cannot be censored.");
-echo "</dd>";
-DT("What is the content identifier in the SBlock?");
-echo "<dd>";
-W("Using a logical name (a string) as the Identifier would enable users to 
exchange and store &quot;rational&quot; keys (&quot;2DOK3OWCI/index.html&quot; 
would have more meaning than &quot;2DOK3OWCI/X4YCKLM&quot;.");
-W("It also would allow pointing to future SBlocks.");
-W("With a content-based identifier we would have to know the content 
beforehand.");
-W("Reducing human error would be good, but is it worth preventing links to 
future?");
-BR();BR();
-W("Thus the best solution is to do both.");
-W("If the user does not specify a name, the system can compute one and provide 
a name that is guaranteed to be unique.");
-W("But if the user wants to have a specific name, that is also possible.");
-W("Note that internally we should always convert the name to a hashcode in 
order to avoid the requirement for variable-length names.");
-echo "</dd>";
-DT("How does this scheme differ from current mechanisms used in Freenet?");
-echo "<dd>";
-W("Freenet development is still ongoing, so the explanation might be 
outdated/wrong.");
-W("Sorry.");
-W("Very little.");
-W("The main difference is that Freenet Project hasn&rsquo;t attempted to 
standardize filelists (filelists as in &rsquo;something user-browsable, 
containing descriptions etc&rsquo;, like in Frost) as we do.");
-W("Freenet metablocks are human-readable, GNUnet strives for efficiency and 
simplicity.");
-W("Number of files presentable in a freenet metablock is limited.");
-W("Through use of Directory, we don&rsquo;t have that limitation.");
-W("Both approaches are suitable for implementing a HTTP proxy upon and both 
allow untamperable publishing of recursively browsable websites.");
-W("However, our main emphasis is to allow publishing, browsing and downloading 
of file collections, partly or entirely, without forcing the user to 
artificially archive the content (multiple representations of same content is 
wasteful from the network&rsquo;s viewpoint) or publish separate, 
unstandardized content listings in addition to the actual files.");
-echo "</dd><dt>";
-
-H3("Acknowledgments ");
-
-BP();
-W("Some of the ideas presented here cannibalized and adapted from end-user 
level knowledge of the %s.",
-       extlink_("http://www.freenetproject.org/","Freenet Project"));
-EP();
-
-/*
- revisions:
-11/18/2002, first draft by IW with minor revisions by CG.
-11/27/2002-11/28/2002, minor elaborations by IW
-12/20/2002, heavy hacking by CG
-08/07/2003, evolving the draft to keep it in sync with the implementation
-*/
-include("html_footer.php3");
-?>





reply via email to

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