1
2
3 """GNU zip."""
4
5 import struct, zlib
6 import dpkt
7
8
9 GZIP_MAGIC = '\x1f\x8b'
10
11
12 GZIP_MSTORED = 0
13 GZIP_MCOMPRESS = 1
14 GZIP_MPACKED = 2
15 GZIP_MLZHED = 3
16 GZIP_MDEFLATE = 8
17
18
19 GZIP_FTEXT = 0x01
20 GZIP_FHCRC = 0x02
21 GZIP_FEXTRA = 0x04
22 GZIP_FNAME = 0x08
23 GZIP_FCOMMENT = 0x10
24 GZIP_FENCRYPT = 0x20
25 GZIP_FRESERVED = 0xC0
26
27
28 GZIP_OS_MSDOS = 0
29 GZIP_OS_AMIGA = 1
30 GZIP_OS_VMS = 2
31 GZIP_OS_UNIX = 3
32 GZIP_OS_VMCMS = 4
33 GZIP_OS_ATARI = 5
34 GZIP_OS_OS2 = 6
35 GZIP_OS_MACOS = 7
36 GZIP_OS_ZSYSTEM = 8
37 GZIP_OS_CPM = 9
38 GZIP_OS_TOPS20 = 10
39 GZIP_OS_WIN32 = 11
40 GZIP_OS_QDOS = 12
41 GZIP_OS_RISCOS = 13
42 GZIP_OS_UNKNOWN = 255
43
44 GZIP_FENCRYPT_LEN = 12
45
47 __hdr__ = (
48 ('id', '2s', ''),
49 ('len', 'H', 0)
50 )
51
52 -class Gzip(dpkt.Packet):
53 __hdr__ = (
54 ('magic', '2s', GZIP_MAGIC),
55 ('method', 'B', GZIP_MDEFLATE),
56 ('flags', 'B', 0),
57 ('mtime', 'I', 0),
58 ('xflags', 'B', 0),
59 ('os', 'B', GZIP_OS_UNIX),
60
61 ('extra', '0s', ''),
62 ('filename', '0s', ''),
63 ('comment', '0s', '')
64 )
65
67 super(Gzip, self).unpack(buf)
68 if self.flags & GZIP_FEXTRA:
69 n = struct.unpack(self.data[:2], '>H')[0]
70 self.extra = GzipExtra(self.data[2:2+n])
71 self.data = self.data[2+n:]
72 if self.flags & GZIP_FNAME:
73 n = self.data.find('\x00')
74 self.filename = self.data[:n]
75 self.data = self.data[n + 1:]
76 if self.flags & GZIP_FCOMMENT:
77 n = self.data.find('\x00')
78 self.comment = self.data[:n]
79 self.data = self.data[n + 1:]
80 if self.flags & GZIP_FENCRYPT:
81 self.data = self.data[GZIP_FENCRYPT_LEN:]
82 if self.flags & GZIP_FHCRC:
83 self.data = self.data[2:]
84
86 l = []
87 if self.extra:
88 self.flags |= GZIP_FEXTRA
89 s = str(self.extra)
90 l.append(struct.pack('>H', len(s)))
91 l.append(s)
92 if self.filename:
93 self.flags |= GZIP_FNAME
94 l.append(self.filename)
95 l.append('\x00')
96 if self.comment:
97 self.flags |= GZIP_FCOMMENT
98 l.append(self.comment)
99 l.append('\x00')
100 l.insert(0, super(Gzip, self).pack_hdr())
101 return ''.join(l)
102
104 """Compress self.data."""
105 c = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS,
106 zlib.DEF_MEM_LEVEL, 0)
107 self.data = c.compress(self.data)
108
110 """Return decompressed payload."""
111 d = zlib.decompressobj(-zlib.MAX_WBITS)
112 return d.decompress(self.data)
113
114 if __name__ == '__main__':
115 import sys
116 gz = Gzip(open(sys.argv[1]).read())
117 print `gz`, `gz.decompress()`
118