cobiz / src /hwp5 /proc /diststream.py
seawolf2357's picture
Add src
d94b56e verified
# -*- coding: utf-8 -*-
#
# pyhwp : hwp file format parser in python
# Copyright (C) 2010-2023 mete0r <https://github.com/mete0r>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
''' 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