|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
''' Decode distribute doc stream. |
|
|
|
|
|
Usage:: |
|
|
|
|
|
hwp5proc diststream |
|
|
hwp5proc diststream sha1 [--raw] |
|
|
hwp5proc diststream key [--raw] |
|
|
hwp5proc diststream [--loglevel=<loglevel>] [--logfile=<logfile>] |
|
|
hwp5proc diststream --help |
|
|
|
|
|
Options:: |
|
|
|
|
|
-h --help Show this screen |
|
|
--loglevel=<level> Set log level. |
|
|
--logfile=<file> Set log file. |
|
|
|
|
|
Example:: |
|
|
|
|
|
$ hwp5proc cat --ole samples/viewtext.hwp ViewText/Section0 |
|
|
| tee Section0.zraw.aes128ecb | hwp5proc diststream | tee Section0.zraw |
|
|
| hwp5proc rawunz > Section0 |
|
|
|
|
|
$ hwp5proc diststream sha1 < Section0.zraw.aes128ecb |
|
|
$ echo -n '12345' | sha1sum |
|
|
|
|
|
''' |
|
|
from __future__ import absolute_import |
|
|
from __future__ import print_function |
|
|
from __future__ import unicode_literals |
|
|
from binascii import b2a_hex |
|
|
from binascii import a2b_hex |
|
|
import logging |
|
|
import shutil |
|
|
import sys |
|
|
|
|
|
from ..distdoc import decode |
|
|
from ..distdoc import decode_head_to_sha1 |
|
|
from ..distdoc import decode_head_to_key |
|
|
from ..recordstream import read_record |
|
|
|
|
|
|
|
|
PY2 = sys.version_info.major == 2 |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
def main(args): |
|
|
if PY2: |
|
|
input_fp = sys.stdin |
|
|
output_fp = sys.stdout |
|
|
else: |
|
|
input_fp = sys.stdin.buffer |
|
|
output_fp = sys.stdout.buffer |
|
|
|
|
|
if args.sha1: |
|
|
head = read_record(input_fp, 0) |
|
|
sha1ucs16le = decode_head_to_sha1(head['payload']) |
|
|
sha1 = a2b_hex(sha1ucs16le.decode('utf-16le')) |
|
|
if not args.raw: |
|
|
sha1 = b2a_hex(sha1) |
|
|
output_fp.write(sha1) |
|
|
elif args.key: |
|
|
head = read_record(input_fp, 0) |
|
|
key = decode_head_to_key(head['payload']) |
|
|
if not args.raw: |
|
|
key = b2a_hex(key) |
|
|
output_fp.write(key) |
|
|
else: |
|
|
result = decode(input_fp) |
|
|
shutil.copyfileobj(result, output_fp) |
|
|
|
|
|
|
|
|
def diststream_argparser(subparsers, _): |
|
|
parser = subparsers.add_parser( |
|
|
'diststream', |
|
|
help=_( |
|
|
'Decode a distribute document stream.' |
|
|
), |
|
|
description=_( |
|
|
'Decode a distribute document stream.' |
|
|
), |
|
|
) |
|
|
op_group = parser.add_mutually_exclusive_group() |
|
|
op_group.add_argument( |
|
|
'--sha1', |
|
|
action='store_true', |
|
|
help=_('Print SHA-1 value for decryption.'), |
|
|
) |
|
|
op_group.add_argument( |
|
|
'--key', |
|
|
action='store_true', |
|
|
help=_('Print decrypted key.'), |
|
|
) |
|
|
parser.add_argument( |
|
|
'--raw', |
|
|
action='store_true', |
|
|
help=_('Print raw binary objects as is.'), |
|
|
) |
|
|
parser.set_defaults(func=main) |
|
|
return parser |
|
|
|