include description of object validation with crypto.py scan mode
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Tue, 29 Aug 2017 07:53:46 +0000 (09:53 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 2 Apr 2018 11:34:09 +0000 (13:34 +0200)
Example output for a second object with a corrupt byte in the
size field:

    PDT: obj 1: read payload @64
    PDT:    · version         = 1                    : 0100
    PDT:    · paramversion    = 1                    : 0100
    PDT:    · nacl                                   : 1dc1 154a 5405 ef5e df81 173f 2821 7a0c
    PDT:    · iv                                     : 7cae 452a a05b 5182 0300 0000
    PDT:    · ctsize          = 230                  : e600 0000 0000 0000
    PDT:    · tag                                    : 42c0 8774 3309 88eb 0e1a 71dc 8fd9 80c1
    PDT: 0 → ✓ valid object 64–294
    PDT: 294 → EOF inside object (358≤5312627≤1095216701872); adjusting size to 5312269
    PDT: obj 2: read payload @358
    PDT:    · version         = 1                    : 0100
    PDT:    · paramversion    = 1                    : 0100
    PDT:    · nacl                                   : 1dc1 154a 5405 ef5e df81 173f 2821 7a0c
    PDT:    · iv                                     : 7cae 452a a05b 5182 0400 0000
    PDT:    · ctsize          = 5312269              : 0d0f 5100 0000 0000
    PDT:    · tag                                    : 5946 dbcf 41b9 ac7e 4729 9e09 46c7 3388
    PDT: GCM tag mismatch for object 358–5312627
    PDT: 294 → × fishy object 358–5312627, corrupt header

deltatar/crypto.py

index 41f0cbd..676fa18 100755 (executable)
@@ -553,6 +553,16 @@ HDR_CAND_GOOD       = 0 # header marks begin of valid object
 HDR_CAND_FISHY      = 1 # inconclusive (tag mismatch, obj overlap etc.)
 HDR_CAND_JUNK       = 2 # not a header / object unreadable
 
+HDR_VERDICT_NAME = \
+    { HDR_CAND_GOOD  : "valid"
+    , HDR_CAND_FISHY : "fishy"
+    , HDR_CAND_JUNK  : "junk"
+    }
+
+
+def verdict_fmt (vdt):
+    return HDR_VERDICT_NAME [vdt]
+
 
 def inspect_hdr (fd, off):
     """
@@ -1911,7 +1921,10 @@ def mode_scan (secret, fname, outs=None, nacl=None):
             nobj += 1
             vdt, hdr = inspect_hdr (ifd, cand)
 
+            vdts = verdict_fmt (vdt)
+
             if vdt == HDR_CAND_JUNK:
+                noise ("PDT: obj %d: %s object: bad header, skipping" % vdts)
                 junk.append (cand)
             else:
                 off0 = cand + PDTCRYPT_HDR_SIZE
@@ -1935,17 +1948,17 @@ def mode_scan (secret, fname, outs=None, nacl=None):
                     if ofd != -1:
                         os.close (ofd)
                 if vdt == HDR_CAND_GOOD and ok is True:
-                    noise ("PDT: %d → ✓ valid object %d–%d"
-                           % (cand, off0, off0 + ctsize))
+                    noise ("PDT: %d → ✓ %s object %d–%d"
+                           % (cand, vdts, off0, off0 + ctsize))
                 elif vdt == HDR_CAND_FISHY and ok is True:
-                    noise ("PDT: %d → × object %d–%d, corrupt header"
-                           % (cand, off0, off0 + ctsize))
+                    noise ("PDT: %d → × %s object %d–%d, corrupt header"
+                           % (cand, vdts, off0, off0 + ctsize))
                 elif vdt == HDR_CAND_GOOD and ok is False:
-                    noise ("PDT: %d → × object %d–%d, problematic payload"
-                           % (cand, off0, off0 + ctsize))
+                    noise ("PDT: %d → × %s object %d–%d, problematic payload"
+                           % (cand, vdts, off0, off0 + ctsize))
                 elif vdt == HDR_CAND_FISHY and ok is False:
-                    noise ("PDT: %d → × object %d–%d, corrupt header, problematic "
-                           "ciphertext" % (cand, off0, off0 + ctsize))
+                    noise ("PDT: %d → × %s object %d–%d, corrupt header, problematic "
+                           "ciphertext" % (cand, vdts, off0, off0 + ctsize))
                 else:
                     raise Unreachable
     finally: