3dfd26970b
This (compatibility-breaking) change moves much of the validation data and encoding parameters out of the URI and into the so-called "thingA" block (which will get a better name as soon as we find one we're comfortable with). The URI retains the "storage_index" (a generalized term for the role that we're currently using the verifierid for, the unique index for each file that gets used by storage servers to decide which shares to return), the decryption key, the needed_shares/total_shares counts (since they affect peer selection), and the hash of the thingA block. This shortens the URI and lets us add more kinds of validation data without growing the URI (like plaintext merkle trees, to enable strong incremental plaintext validation), at the cost of maybe 150 bytes of alacrity. Each storage server holds an identical copy of the thingA block. This is an incompatible change: new messages have been added to the storage server interface, and the URI format has changed drastically.
44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
|
|
from allmydata.util import idlib
|
|
|
|
# the URI shall be an ascii representation of the file. It shall contain
|
|
# enough information to retrieve and validate the contents. It shall be
|
|
# expressed in a limited character set (namely [TODO]).
|
|
|
|
def pack_uri(storage_index, key, thingA_hash,
|
|
needed_shares, total_shares, size):
|
|
# applications should pass keyword parameters into this
|
|
assert isinstance(storage_index, str)
|
|
assert len(storage_index) == 20 # sha1 hash. TODO: sha256
|
|
|
|
assert isinstance(thingA_hash, str)
|
|
assert len(thingA_hash) == 32 # sha56 hash
|
|
|
|
assert isinstance(key, str)
|
|
assert len(key) == 16 # AES-128
|
|
assert isinstance(needed_shares, int)
|
|
assert isinstance(total_shares, int)
|
|
assert isinstance(size, (int,long))
|
|
|
|
return "URI:%s:%s:%s:%d:%d:%d" % (idlib.b2a(storage_index), idlib.b2a(key),
|
|
idlib.b2a(thingA_hash),
|
|
needed_shares, total_shares, size)
|
|
|
|
|
|
def unpack_uri(uri):
|
|
assert uri.startswith("URI:")
|
|
d = {}
|
|
(header,
|
|
storage_index_s, key_s, thingA_hash_s,
|
|
needed_shares_s, total_shares_s, size_s) = uri.split(":")
|
|
assert header == "URI"
|
|
d['storage_index'] = idlib.a2b(storage_index_s)
|
|
d['key'] = idlib.a2b(key_s)
|
|
d['thingA_hash'] = idlib.a2b(thingA_hash_s)
|
|
d['needed_shares'] = int(needed_shares_s)
|
|
d['total_shares'] = int(total_shares_s)
|
|
d['size'] = int(size_s)
|
|
return d
|
|
|
|
|