2
0
Эх сурвалжийг харах

Use buffer instead of string slicing to reduce memory usage.

Jonas Borgström 12 жил өмнө
parent
commit
bda6bc47d7
3 өөрчлөгдсөн 10 нэмэгдсэн , 7 устгасан
  1. 5 5
      darc/key.py
  2. 2 2
      darc/remote.py
  3. 3 0
      darc/test.py

+ 5 - 5
darc/key.py

@@ -83,7 +83,7 @@ class PlaintextKey(KeyBase):
     def decrypt(self, id, data):
         if data[0] != self.TYPE:
             raise IntegrityError('Invalid encryption envelope')
-        data = zlib.decompress(data[1:])
+        data = zlib.decompress(buffer(data, 1))
         if id and SHA256.new(data).digest() != id:
             raise IntegrityError('Chunk id verification failed')
         return data
@@ -107,12 +107,12 @@ class AESKeyBase(KeyBase):
     def decrypt(self, id, data):
         if data[0] != self.TYPE:
             raise IntegrityError('Invalid encryption envelope')
-        hash = data[1:33]
-        if HMAC.new(self.enc_hmac_key, data[33:], SHA256).digest() != hash:
+        hash = buffer(data, 1, 32)
+        if buffer(HMAC.new(self.enc_hmac_key, buffer(data, 33), SHA256).digest()) != hash:
             raise IntegrityError('Encryption envelope checksum mismatch')
-        nonce = bytes_to_long(data[33:41])
+        nonce = bytes_to_long(buffer(data, 33, 8))
         counter = Counter.new(64, initial_value=nonce, prefix=PREFIX)
-        data = zlib.decompress(AES.new(self.enc_key, AES.MODE_CTR, counter=counter).decrypt(data[41:]))
+        data = zlib.decompress(AES.new(self.enc_key, AES.MODE_CTR, counter=counter).decrypt(buffer(data, 41)))
         if id and HMAC.new(self.id_key, data, SHA256).digest() != id:
             raise IntegrityError('Chunk id verification failed')
         return data

+ 2 - 2
darc/remote.py

@@ -127,7 +127,7 @@ class RemoteStore(object):
                 if to_send:
                     n = os.write(self.stdin_fd, to_send)
                     assert n > 0
-                    to_send = to_send[n:]
+                    to_send = buffer(to_send, n)
                 else:
                     w_fds = []
 
@@ -212,7 +212,7 @@ class RemoteStore(object):
                 if self.to_send:
                     n = os.write(self.stdin_fd, self.to_send)
                     assert n > 0
-                    self.to_send = self.to_send[n:]
+                    self.to_send = buffer(self.to_send, n)
                 else:
                     w_fds = []
                     if not wait:

+ 3 - 0
darc/test.py

@@ -92,6 +92,9 @@ class Test(unittest.TestCase):
                 attrs.append('st_mtime')
             d1 = [filename] + [getattr(s1, a) for a in attrs]
             d2 = [filename] + [getattr(s2, a) for a in attrs]
+            if(len(d1) == 6):
+                d1[-1] = int(d1[-1])
+                d2[-1] = int(d2[-1])
             d1.append(self.get_xattrs(path1))
             d2.append(self.get_xattrs(path2))
             self.assertEqual(d1, d2)