|
58 | 58 | MODE_READ = 'r'
|
59 | 59 | MODE_WRITE = 'w'
|
60 | 60 |
|
61 |
| -BLOCK_SIZE = 16 |
| 61 | +BLOCK_SIZE = 1024 |
62 | 62 |
|
63 | 63 | class InvalidScryptFileFormat(Exception): pass
|
64 | 64 |
|
@@ -308,47 +308,36 @@ def read(self, size = None):
|
308 | 308 | # end-of-file checksum) and decrypt into a decrypted buffer 1 block at a time
|
309 | 309 | while not self._read_finished:
|
310 | 310 |
|
311 |
| - # We have enough decrypted bytes (or will after decrypted a few encrypted blocks) |
312 |
| - if len(self._decrypted_buffer) + len(self._encrypted_buffer) - 32 >= size: break |
| 311 | + # We have enough decrypted bytes (or will after decrypting the encrypted buffer) |
| 312 | + available = len(self._decrypted_buffer) + len(self._encrypted_buffer) - 32 |
| 313 | + if available >= size: break |
313 | 314 |
|
314 |
| - # Read enough AES-256 blocks with a little extra for the possible final checksum |
315 |
| - count = int(BLOCK_SIZE * math.ceil(size / BLOCK_SIZE)) + 32 |
316 |
| - data = '' |
317 |
| - while len(data) < count: |
318 |
| - chunk = self._fp.read(count - len(data)) |
319 |
| - if not chunk: break |
320 |
| - data += chunk |
| 315 | + # Read a little extra for the possible final checksum |
| 316 | + data = self._fp.read(BLOCK_SIZE) |
321 | 317 |
|
322 |
| - self._encrypted_buffer += data |
323 |
| - |
324 |
| - # We didn't get as much as we wanted... The file must be done |
325 |
| - if len(data) != count: |
| 318 | + # No data left; we're done |
| 319 | + if not data: |
326 | 320 | self._read_finished = True
|
327 | 321 | break
|
328 | 322 |
|
329 |
| - # Decrypt as many of the encrypted blocks as possible (leaving the final check sum) |
330 |
| - while len(self._encrypted_buffer) >= BLOCK_SIZE + 32: |
331 |
| - block = self._encrypted_buffer[:BLOCK_SIZE] |
332 |
| - self._decrypted_buffer += self._crypto.decrypt(block) |
333 |
| - self._checksumer.update(block) |
334 |
| - self._encrypted_buffer = self._encrypted_buffer[BLOCK_SIZE:] |
| 323 | + self._encrypted_buffer += data |
| 324 | + |
| 325 | + # Decrypt as much of the encrypted data as possible (leaving the final check sum) |
| 326 | + safe = self._encrypted_buffer[:-32] |
| 327 | + self._encrypted_buffer = self._encrypted_buffer[-32:] |
| 328 | + self._decrypted_buffer += self._crypto.decrypt(safe) |
| 329 | + self._checksumer.update(safe) |
335 | 330 |
|
336 |
| - # We read all the bytes, so what is left is possible a little more encrypted bytes and the checksum |
| 331 | + # We read all the bytes, only the checksum remains |
337 | 332 | if self._read_finished:
|
338 |
| - leftover = self._encrypted_buffer[:-32] |
339 |
| - checksum = self._encrypted_buffer[-32:] |
340 |
| - if leftover: |
341 |
| - self._decrypted_buffer += self._crypto.decrypt(leftover) |
342 |
| - self._checksumer.update(leftover) |
343 |
| - self._check_final_checksum(checksum) |
| 333 | + self._check_final_checksum(self._encrypted_buffer) |
344 | 334 |
|
345 | 335 | # Send back the number of bytes requests and remove them from the buffer
|
346 | 336 | decrypted = self._decrypted_buffer[:size]
|
347 | 337 | self._decrypted_buffer = self._decrypted_buffer[size:]
|
348 | 338 |
|
349 | 339 | return decrypted
|
350 | 340 |
|
351 |
| - |
352 | 341 | # Write operations
|
353 | 342 | def flush(self):
|
354 | 343 | "Flush the underlying file object's I/O buffer."
|
@@ -422,13 +411,7 @@ def write(self, str):
|
422 | 411 | if not self._done_header:
|
423 | 412 | self._write_header()
|
424 | 413 |
|
425 |
| - self._decrypted_buffer += str |
426 |
| - |
427 |
| - output = '' |
428 |
| - while len(self._decrypted_buffer) >= BLOCK_SIZE: |
429 |
| - block = self._crypto.encrypt(self._decrypted_buffer[:BLOCK_SIZE]) |
430 |
| - output += block |
431 |
| - self._decrypted_buffer = self._decrypted_buffer[BLOCK_SIZE:] |
432 |
| - self._checksumer.update(block) |
433 |
| - self._fp.write(output) |
| 414 | + encrypted = self._crypto.encrypt(str) |
| 415 | + self._checksumer.update(encrypted) |
| 416 | + self._fp.write(encrypted) |
434 | 417 |
|
0 commit comments