mirror of
https://gist.github.com/jameshilliard/7112235b62dd929d69d7980c979ae7c0
synced 2024-11-14 19:04:59 -05:00
This commit is contained in:
commit
37ae77acbf
1 changed files with 58 additions and 0 deletions
58
gwdecrypt.py
Normal file
58
gwdecrypt.py
Normal file
|
@ -0,0 +1,58 @@
|
|||
#!/usr/bin/env python3
|
||||
# W.J. van der Laan 2017, distributed under MIT license
|
||||
# James Hilliard 2017
|
||||
import binascii
|
||||
import base64
|
||||
import struct
|
||||
import json
|
||||
import os, sys
|
||||
import hashlib
|
||||
from Crypto import Random
|
||||
from Crypto.Cipher import AES
|
||||
|
||||
KEY = binascii.a2b_hex(b'fffffbffeffffbfffbbfffbfdbfff7ffffffffffffffdfffff7fffffbfffffff')
|
||||
|
||||
def unpad(s):
|
||||
'''PKCS7 unpad.'''
|
||||
padlen = s[len(s)-1]
|
||||
if padlen > 16:
|
||||
raise ValueError('Invalid padding')
|
||||
return s[:-padlen]
|
||||
|
||||
def decrypt(data_in):
|
||||
# first 32 bytes are IV, we only need 16 of that
|
||||
iv = data_in[0:16]
|
||||
cipher = AES.new(KEY, AES.MODE_CBC, iv)
|
||||
data_out = cipher.decrypt(data_in[32:])
|
||||
data_out = unpad(data_out)
|
||||
|
||||
crc = data_out[0:4]
|
||||
ccrc = struct.pack('I',binascii.crc32(data_out[4:]))
|
||||
assert(crc == ccrc)
|
||||
json_data = json.loads(data_out[4:].decode())
|
||||
return json_data
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print('Usage: %s /path/to/configfile.bin' % os.path.basename(sys.argv[0]))
|
||||
exit(1)
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
data_in = base64.b64decode(f.read())
|
||||
|
||||
# decode second layer, create one huge JSON file with record types at top level
|
||||
json_data = decrypt(data_in)
|
||||
out_recs = {}
|
||||
for record in json_data:
|
||||
|
||||
d = base64.b64decode(record['data'])
|
||||
assert(record['type'] not in out_recs) # duplicate
|
||||
out_recs[record['type']] = decrypt(d)
|
||||
|
||||
if len(sys.argv) == 3:
|
||||
with open(sys.argv[2], 'w') as outfile:
|
||||
json.dump(out_recs, outfile, indent=4, separators=(',', ': '))
|
||||
else:
|
||||
json.dump(out_recs, sys.stdout, indent=4, separators=(',', ': '))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in a new issue