~dmedia/filestore/trunk

« back to all changes in this revision

Viewing changes to filestore/misc.py

  • Committer: Jason Gerard DeRose
  • Date: 2013-02-19 16:54:29 UTC
  • mfrom: (303.1.35 dbase32)
  • Revision ID: jderose@novacut.com-20130219165429-bjyp6c3m9b0r28nl
Switch V1 protocol to D-Base32, 240-bit hash

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
import tempfile
29
29
import shutil
30
30
from hashlib import md5
31
 
from collections import OrderedDict
32
 
 
 
31
 
 
32
from dbase32 import db32enc
 
33
 
 
34
from .protocols import PERS_LEAF, PERS_ROOT, VERSION1
33
35
from . import FileStore
34
 
from .protocols import b32dumps
35
 
 
36
 
 
37
 
TEST_VECTORS = path.join(
38
 
    path.dirname(path.abspath(__file__)), 'data', 'test-vectors.json'
39
 
)
40
 
assert path.isfile(TEST_VECTORS)
41
 
 
42
 
 
43
 
def load_test_vectors():
44
 
    return json.load(open(TEST_VECTORS, 'r'))
45
 
 
46
 
 
47
 
def build_test_leaves(leaf_size):
 
36
 
 
37
 
 
38
DATADIR = path.join(path.dirname(path.abspath(__file__)), 'data')
 
39
 
 
40
 
 
41
def dumps(obj):
 
42
    return json.dumps(obj,
 
43
        ensure_ascii=False,
 
44
        sort_keys=True,
 
45
        separators=(',',': '),
 
46
        indent=4,
 
47
    )
 
48
 
 
49
 
 
50
def load_data(name):
 
51
    filename = path.join(DATADIR, name + '.json')
 
52
    return json.load(open(filename, 'r'))
 
53
 
 
54
 
 
55
def build_leaves(leaf_size):
48
56
    return {
49
57
        'A': b'A',
50
58
        'B': b'B' * (leaf_size - 1),
52
60
    }
53
61
 
54
62
 
55
 
def build_test_vectors(protocol):
56
 
    leaves = build_test_leaves(protocol.leaf_size)
57
 
 
58
 
    def hash_root(letters):
 
63
def build_vectors(protocol, encoder=db32enc):
 
64
    leaves = build_leaves(protocol.leaf_size)
 
65
 
 
66
    def hash_leaf(i, L):
 
67
        return encoder(protocol.hash_leaf(i, leaves[L]))
 
68
 
 
69
    def hash_root(name):
59
70
        leaf_hashes = b''
60
71
        file_size = 0
61
 
        for (i, L) in enumerate(letters):
 
72
        for (i, L) in enumerate(name):
62
73
            data = leaves[L]
63
74
            leaf_hashes += protocol.hash_leaf(i, data)
64
75
            file_size += len(data)
65
 
        return protocol.hash_root(file_size, leaf_hashes)
 
76
        return encoder(protocol.hash_root(file_size, leaf_hashes))
66
77
 
67
78
    vectors = {
68
79
        'leaf_hashes': {},
69
80
        'root_hashes': {},
70
81
    }
71
82
 
72
 
    for (key, data) in leaves.items():
73
 
        vectors['leaf_hashes'][key] = [
74
 
            b32dumps(protocol.hash_leaf(i, data)) for i in range(2)
75
 
        ]
 
83
    for L in leaves:
 
84
        vectors['leaf_hashes'][L] = [hash_leaf(i, L) for i in range(2)]
76
85
 
77
86
    for L in leaves:
78
 
        for key in (L, 'C' + L):
79
 
            vectors['root_hashes'][key] = hash_root(key)
 
87
        for name in (L, 'C' + L):
 
88
            vectors['root_hashes'][name] = hash_root(name)
80
89
 
81
90
    return vectors
82
91
 
83
92
 
84
 
def get_test_integers(leaf_size):
 
93
def get_integers(leaf_size):
85
94
    return [
86
95
        0,
87
96
        1,
93
102
    ]
94
103
 
95
104
 
96
 
def build_test_md5(leaf_size):
 
105
def build_md5sums(leaf_size):
97
106
    integers = dict(
98
107
        (str(i), md5(str(i).encode('utf-8')).hexdigest())
99
 
        for i in get_test_integers(leaf_size)
 
108
        for i in get_integers(leaf_size)
100
109
    )
101
 
    leaves = build_test_leaves(leaf_size)
 
110
 
 
111
    leaves = build_leaves(leaf_size)
102
112
    C = leaves['C']
103
113
    files = {}
104
114
    for (key, data) in leaves.items():
105
115
        files[key] = md5(data).hexdigest()
106
116
        files['C' + key] = md5(C + data).hexdigest()
 
117
 
107
118
    return {
108
119
        'integers': integers,
109
120
        'files': files,
 
121
        'personalization': {
 
122
            'leaf': md5(PERS_LEAF).hexdigest(),
 
123
            'root': md5(PERS_ROOT).hexdigest(),
 
124
        }   
110
125
    }
111
126
 
112
127
 
145
160
        if path.isdir(self.parentdir):
146
161
            shutil.rmtree(self.parentdir)
147
162
 
 
163
 
 
164
if __name__ == '__main__':
 
165
    vectors = build_vectors(VERSION1)
 
166
    print(dumps(vectors))
 
167