A file format for a serverless distributed file system is composed of two parts:
a primary data stream and a metadata stream. The data stream contains a file that
is divided into multiple blocks. Each block is encrypted using a hash of the block
as the encryption key. The metadata stream contains a header, a structure for indexing
the encrypted blocks in the primary data stream, and some user information. The
indexing structure defines leaf nodes for each of the blocks. Each leaf node consists
of an access value used for decryption of the associated block and a verification
value used to verify the encrypted block independently of other blocks. In one
implementation, the access value is formed by hashing the file block and encrypting
the resultant hash value using a randomly generated key. The key is then encrypted
using the user's key as the encryption key. The verification value is formed by
hashing the associated encrypted block using a one-way hash function. The file
format supports verification of individual file blocks without knowledge of the
randomly generated key or any user keys. To verify a block of the file, the file
system traverses the tree to the appropriate leaf node associated with a target
block to be verified. The file system hashes the target block and if the hash matches
the access value contained in the leaf node, the block is authentic.