cnt = None # file counter (uint32_t != 0)
iv = None # current IV
pfx = None # accu for 64 bit fixed parts of IV
- password = None
+ password = None
+ paramversion = None
stats = { "in" : 0
, "out" : 0
, "obj" : 0 }
ctsize = -1
ptsize = -1
- paramversion = None
info_counter_used = False
def __init__ (self, *al, **akv):
kdf = kdf_by_version (paramversion)
if kdf is not None:
self.key, self.nacl = kdf (password, nacl)
-
self.paramversion = paramversion
class Encrypt (Crypto):
- curobj = None
- hdrdum = None
- paramversion = None
+ lastinfo = None
+ version = None
paramenc = None
- def __init__ (self, password, paramversion, nacl=None,
+ def __init__ (self, password, version, paramversion, nacl=None,
counter=AES_GCM_IV_CNT_DATA):
if len (password) == 0:
raise Exception ("XXX refusing to encrypt with empty password")
- self.pfx = [ ]
- self.paramversion = paramversion
- defs = ENCRYPTION_PARAMETERS.get(self.paramversion)
- self.paramenc = defs ["enc"]
+ self.pfx = [ ]
+ self.version = version
+ self.paramenc = ENCRYPTION_PARAMETERS.get (paramversion) ["enc"]
super().__init__ (password, paramversion, nacl, counter=counter,
nextpfx=lambda: self.pfx.append (os.urandom(8)))
return struct.pack(FMT_I2N_IV, self.pfx [-1], self.cnt)
- def next (self, filename, version, nacl, counter=None):
- self.curobj = (filename, version, nacl or self.nacl)
+ def next (self, filename, counter=None):
self.iv = self.iv_make ()
if self.paramenc == "aes-gcm":
self.enc = Cipher \
else:
raise Exception ("XXX garbage encryption parameter %d → %r"
% (self.paramversion, enc))
- self.hdrdum = hdr_make_dummy (filename)
- super().next (self.password, self.paramversion, nacl)
+ hdrdum = hdr_make_dummy (filename)
+ self.lastinfo = (filename, hdrdum)
+ super().next (self.password, self.paramversion, self.nacl)
self.set_object_counter (counter if counter is not None else self.cnt + 1)
- return self.hdrdum
+ return hdrdum
def done (self, cmpdata):
- if cmpdata != self.hdrdum:
+ filename, hdrdum = self.lastinfo
+ if cmpdata != hdrdum:
raise Exception ("XXX bad sync for writing header") ## we need to converge on a sensible error handling strategy
data = self.enc.finalize ()
self.stats ["out"] += len (data)
self.ctsize += len (data)
- (filename, version, nacl) = self.curobj
- ok, hdr = hdr_from_params (version, self.paramversion, nacl, self.iv,
- self.ctsize, self.enc.tag)
+ ok, hdr = hdr_from_params (self.version, self.paramversion, self.nacl,
+ self.iv, self.ctsize, self.enc.tag)
if ok is False:
raise Exception ("XXX error constructing header: %r" % hdr) ## we need to converge on a sensible error handling strategy
return data, hdr, self.pfx
# setup for encrypting payload
if self.password is not None:
- self.crypto_ctx = crypto.Encrypt (self.password,
- paramversion=DELTATAR_PARAMETER_VERSION)
+ self.crypto_ctx = \
+ crypto.Encrypt (self.password,
+ version=DELTATAR_HEADER_VERSION,
+ paramversion=DELTATAR_PARAMETER_VERSION)
# some initialization
self.vol_no = 0
index_sink = self.open_auxiliary_file(index_path, 'w') # **NOT** an fd
if index_sink.encryption is not None:
self.nacl = index_sink.encryption.nacl
- dummyhdr = index_sink.encryption.next \
- (path, version=DELTATAR_HEADER_VERSION, nacl=self.nacl)
+ dummyhdr = index_sink.encryption.next (path)
index_sink.write (dummyhdr)
index_sink.write (index_accu.getvalue ())
index_sink.close ()
# setup for encrypting payload
if self.password is not None:
- self.crypto_ctx = crypto.Encrypt (self.password,
- paramversion=DELTATAR_PARAMETER_VERSION)
+ self.crypto_ctx = \
+ crypto.Encrypt (self.password,
+ version=DELTATAR_HEADER_VERSION,
+ paramversion=DELTATAR_PARAMETER_VERSION)
# some initialization
self.vol_no = 0
PAX_FORMAT = 2 # POSIX.1-2001 (pax) format
DEFAULT_FORMAT = GNU_FORMAT
-DELTATAR_HEADER_VERSION = 1
-DELTATAR_PARAMETER_VERSION = 1
-
GZ_FMT_HEADER = b"<BBBBLBB"
GZ_MAGIC = (0x1f, 0x8b) # 0o37, 0o213
GZ_METHOD_DEFLATE = 0x08 # 0o10
# secondly, assemble the header with the updated parameters
# and commit it directly to the underlying stream, bypassing the
# encryption layer in .__write().
- dummyhdr = self.encryption.next (entry,
- version=DELTATAR_HEADER_VERSION,
- nacl=self.encryption.nacl)
+ dummyhdr = self.encryption.next (entry)
if dummyhdr is None:
raise EncryptionError ("Crypto.next(): bad dummy header") # XXX