1 __all__ = ('EncryptedHeapStorage',)
5 from pyoram.util.virtual_heap import SizedVirtualHeap
6 from pyoram.storage.heap_storage import \
9 from pyoram.encrypted_storage.encrypted_block_storage import \
10 (EncryptedBlockStorageInterface,
11 EncryptedBlockStorage)
13 class EncryptedHeapStorageInterface(HeapStorageInterface):
20 def key(self, *args, **kwds):
21 raise NotImplementedError # pragma: no cover
23 def raw_storage(self, *args, **kwds):
24 raise NotImplementedError # pragma: no cover
26 class EncryptedHeapStorage(HeapStorage,
27 EncryptedHeapStorageInterface):
29 def __init__(self, storage, **kwds):
31 if isinstance(storage, EncryptedBlockStorageInterface):
34 "Keywords not used when initializing "
35 "with a storage device: %s"
38 storage = EncryptedBlockStorage(storage, **kwds)
40 super(EncryptedHeapStorage, self).__init__(storage)
43 # Define EncryptedHeapStorageInterface Methods
48 return self._storage.key
51 def raw_storage(self):
52 return self._storage.raw_storage
55 # Define HeapStorageInterface Methods
56 # (override what is defined on HeapStorage)
58 def clone_device(self):
59 return EncryptedHeapStorage(self._storage.clone_device())
62 def compute_storage_size(cls,
69 assert (block_size > 0) and (block_size == int(block_size))
70 assert heap_height >= 0
71 assert blocks_per_bucket >= 1
73 assert 'block_count' not in kwds
74 vheap = SizedVirtualHeap(
77 blocks_per_bucket=blocks_per_bucket)
79 return EncryptedBlockStorage.compute_storage_size(
80 vheap.blocks_per_bucket * block_size,
85 return cls._header_offset + \
86 EncryptedBlockStorage.compute_storage_size(
87 vheap.blocks_per_bucket * block_size,
100 if 'block_count' in kwds:
101 raise ValueError("'block_count' keyword is not accepted")
104 "heap height must be 0 or greater. Invalid value: %s"
106 if blocks_per_bucket < 1:
108 "blocks_per_bucket must be 1 or greater. "
109 "Invalid value: %s" % (blocks_per_bucket))
112 "heap base must be 2 or greater. Invalid value: %s"
115 vheap = SizedVirtualHeap(
118 blocks_per_bucket=blocks_per_bucket)
120 user_header_data = kwds.pop('header_data', bytes())
121 if type(user_header_data) is not bytes:
123 "'header_data' must be of type bytes. "
124 "Invalid type: %s" % (type(user_header_data)))
125 kwds['header_data'] = \
126 struct.pack(cls._header_struct_string,
129 blocks_per_bucket) + \
132 return EncryptedHeapStorage(
133 EncryptedBlockStorage.setup(
135 vheap.blocks_per_bucket * block_size,
136 vheap.bucket_count(),
140 #def header_data(...)
143 #def bucket_count(...)
146 #def bucket_size(...)
149 #def blocks_per_bucket(...)
152 #def storage_name(...)
155 #def virtual_heap(...)
158 #def bucket_storage(...)
160 #def update_header_data(...)
172 #def bytes_received(...)