HDR_FMT = "I2n_header { version: %d, paramversion: %d, nacl: %s[%d]," \
- " iv: %s[%d], ctsize: %d }"
+ " iv: %s[%d], ctsize: %d, tag: %s[%d]}"
def hdr_fmt (h):
return HDR_FMT % (h["version"], h["paramversion"],
binascii.hexlify (h["nacl"]), len(h["nacl"]),
binascii.hexlify (h["iv"]), len(h["iv"]),
- h["ctsize"])
+ h["ctsize"],
+ binascii.hexlify (h["tag"]), len(h["tag"]))
def hex_spaced_of_bytes (b):
iv = hdr ["iv"]
self.tag = hdr ["tag"]
self.aes = Cipher \
- ( algorithms.AES (key)
- , modes.GCM (hdr["iv"])
+ ( algorithms.AES (self.key)
+ , modes.GCM (hdr["iv"], tag=self.tag)
, backend = default_backend ()) \
. decryptor ()
# XXX figure out what we want for AAD. Filename (not known to stream)?
return self.next(hdr)
- def done (self):
- return self.aes.finalize_with_tag (self.tag)
+ def done (self, tag=None):
+ try:
+ if tag is None:
+ return True, self.aes.finalize ()
+ else:
+ return self.aes.finalize_with_tag (self.tag)
+ except crypto.cryptography.exceptions.InvalidTag as exn:
+ return False, repr (exn)
def process (self, buf):