msoffcrypto-tool-4.10.1/0000775000372000037200000000000013520721121015757 5ustar travistravis00000000000000msoffcrypto-tool-4.10.1/MANIFEST.in0000664000372000037200000000027213520721054017523 0ustar travistravis00000000000000include README.md include LICENSE.txt include .noserc # include test source and data files include tests/test_cli.sh recursive-include tests *.py graft tests/inputs graft tests/outputs msoffcrypto-tool-4.10.1/msoffcrypto/0000775000372000037200000000000013520721121020332 5ustar travistravis00000000000000msoffcrypto-tool-4.10.1/msoffcrypto/__main__.py0000664000372000037200000000460413520721054022435 0ustar travistravis00000000000000from __future__ import print_function import logging, sys import argparse import getpass import olefile from . import __version__ from . import OfficeFile logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) def ifWIN32SetBinary(io): if sys.platform == 'win32': import msvcrt, os msvcrt.setmode(io.fileno(), os.O_BINARY) def is_encrypted(file): r''' Test if the file is encrypted. >>> f = open("tests/inputs/plain.doc", "rb") >>> file = OfficeFile(f) >>> is_encrypted(file) False ''' # TODO: Validate file if not olefile.isOleFile(file): return False file = OfficeFile(file) return file.is_encrypted() parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group(required=True) group.add_argument('-p', '--password', nargs='?', const='', dest='password', help='Password text.') group.add_argument('-t', '--test', dest='test_encrypted', action='store_true', help='Test if the file is encrypted.') parser.add_argument('-v', dest='verbose', action='store_true', help='Print verbose information.') parser.add_argument('infile', nargs='?', type=argparse.FileType('rb'), help='Input file.') parser.add_argument('outfile', nargs='?', type=argparse.FileType('wb'), help='Output file. If blank, stdout is used.') def main(): args = parser.parse_args() if args.verbose: logger.removeHandler(logging.NullHandler()) logging.basicConfig(level=logging.DEBUG, format="%(message)s") logger.debug("Version: {}".format(__version__)) if args.test_encrypted: if not is_encrypted(args.infile): print("{}: not encrypted".format(args.infile.name), file=sys.stderr) sys.exit(1) else: logger.debug("{}: encrypted".format(args.infile.name)) return if not olefile.isOleFile(args.infile): raise Exception("Not OLE file") file = OfficeFile(args.infile) if args.password: file.load_key(password=args.password) else: password = getpass.getpass() file.load_key(password=password) if args.outfile is None: ifWIN32SetBinary(sys.stdout) if hasattr(sys.stdout, 'buffer'): # For Python 2 args.outfile = sys.stdout.buffer else: args.outfile = sys.stdout file.decrypt(args.outfile) if __name__ == '__main__': main() msoffcrypto-tool-4.10.1/msoffcrypto/format/0000775000372000037200000000000013520721121021622 5ustar travistravis00000000000000msoffcrypto-tool-4.10.1/msoffcrypto/format/xls97.py0000664000372000037200000004235313520721054023176 0ustar travistravis00000000000000import logging, io, shutil, tempfile from struct import pack, unpack from collections import namedtuple import olefile from . import base from .common import _parse_encryptionheader, _parse_encryptionverifier from ..method.rc4 import DocumentRC4 from ..method.rc4_cryptoapi import DocumentRC4CryptoAPI logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) recordNameNum = { 'Formula': 6, 'EOF': 10, 'CalcCount': 12, 'CalcMode': 13, 'CalcPrecision': 14, 'CalcRefMode': 15, 'CalcDelta': 16, 'CalcIter': 17, 'Protect': 18, 'Password': 19, 'Header': 20, 'Footer': 21, 'ExternSheet': 23, 'Lbl': 24, 'WinProtect': 25, 'VerticalPageBreaks': 26, 'HorizontalPageBreaks': 27, 'Note': 28, 'Selection': 29, 'Date1904': 34, 'ExternName': 35, 'LeftMargin': 38, 'RightMargin': 39, 'TopMargin': 40, 'BottomMargin': 41, 'PrintRowCol': 42, 'PrintGrid': 43, 'FilePass': 47, 'Font': 49, 'PrintSize': 51, 'Continue': 60, 'Window1': 61, 'Backup': 64, 'Pane': 65, 'CodePage': 66, 'Pls': 77, 'DCon': 80, 'DConRef': 81, 'DConName': 82, 'DefColWidth': 85, 'XCT': 89, 'CRN': 90, 'FileSharing': 91, 'WriteAccess': 92, 'Obj': 93, 'Uncalced': 94, 'CalcSaveRecalc': 95, 'Template': 96, 'Intl': 97, 'ObjProtect': 99, 'ColInfo': 125, 'Guts': 128, 'WsBool': 129, 'GridSet': 130, 'HCenter': 131, 'VCenter': 132, 'BoundSheet8': 133, 'WriteProtect': 134, 'Country': 140, 'HideObj': 141, 'Sort': 144, 'Palette': 146, 'Sync': 151, 'LPr': 152, 'DxGCol': 153, 'FnGroupName': 154, 'FilterMode': 155, 'BuiltInFnGroupCount': 156, 'AutoFilterInfo': 157, 'AutoFilter': 158, 'Scl': 160, 'Setup': 161, 'ScenMan': 174, 'SCENARIO': 175, 'SxView': 176, 'Sxvd': 177, 'SXVI': 178, 'SxIvd': 180, 'SXLI': 181, 'SXPI': 182, 'DocRoute': 184, 'RecipName': 185, 'MulRk': 189, 'MulBlank': 190, 'Mms': 193, 'SXDI': 197, 'SXDB': 198, 'SXFDB': 199, 'SXDBB': 200, 'SXNum': 201, 'SxBool': 202, 'SxErr': 203, 'SXInt': 204, 'SXString': 205, 'SXDtr': 206, 'SxNil': 207, 'SXTbl': 208, 'SXTBRGIITM': 209, 'SxTbpg': 210, 'ObProj': 211, 'SXStreamID': 213, 'DBCell': 215, 'SXRng': 216, 'SxIsxoper': 217, 'BookBool': 218, 'DbOrParamQry': 220, 'ScenarioProtect': 221, 'OleObjectSize': 222, 'XF': 224, 'InterfaceHdr': 225, 'InterfaceEnd': 226, 'SXVS': 227, 'MergeCells': 229, 'BkHim': 233, 'MsoDrawingGroup': 235, 'MsoDrawing': 236, 'MsoDrawingSelection': 237, 'PhoneticInfo': 239, 'SxRule': 240, 'SXEx': 241, 'SxFilt': 242, 'SxDXF': 244, 'SxItm': 245, 'SxName': 246, 'SxSelect': 247, 'SXPair': 248, 'SxFmla': 249, 'SxFormat': 251, 'SST': 252, 'LabelSst': 253, 'ExtSST': 255, 'SXVDEx': 256, 'SXFormula': 259, 'SXDBEx': 290, 'RRDInsDel': 311, 'RRDHead': 312, 'RRDChgCell': 315, 'RRTabId': 317, 'RRDRenSheet': 318, 'RRSort': 319, 'RRDMove': 320, 'RRFormat': 330, 'RRAutoFmt': 331, 'RRInsertSh': 333, 'RRDMoveBegin': 334, 'RRDMoveEnd': 335, 'RRDInsDelBegin': 336, 'RRDInsDelEnd': 337, 'RRDConflict': 338, 'RRDDefName': 339, 'RRDRstEtxp': 340, 'LRng': 351, 'UsesELFs': 352, 'DSF': 353, 'CUsr': 401, 'CbUsr': 402, 'UsrInfo': 403, 'UsrExcl': 404, 'FileLock': 405, 'RRDInfo': 406, 'BCUsrs': 407, 'UsrChk': 408, 'UserBView': 425, 'UserSViewBegin': 426, 'UserSViewBegin_Chart': 426, 'UserSViewEnd': 427, 'RRDUserView': 428, 'Qsi': 429, 'SupBook': 430, 'Prot4Rev': 431, 'CondFmt': 432, 'CF': 433, 'DVal': 434, 'DConBin': 437, 'TxO': 438, 'RefreshAll': 439, 'HLink': 440, 'Lel': 441, 'CodeName': 442, 'SXFDBType': 443, 'Prot4RevPass': 444, 'ObNoMacros': 445, 'Dv': 446, 'Excel9File': 448, 'RecalcId': 449, 'EntExU2': 450, 'Dimensions': 512, 'Blank': 513, 'Number': 515, 'Label': 516, 'BoolErr': 517, 'String': 519, 'Row': 520, 'Index': 523, 'Array': 545, 'DefaultRowHeight': 549, 'Table': 566, 'Window2': 574, 'RK': 638, 'Style': 659, 'BigName': 1048, 'Format': 1054, 'ContinueBigName': 1084, 'ShrFmla': 1212, 'HLinkTooltip': 2048, 'WebPub': 2049, 'QsiSXTag': 2050, 'DBQueryExt': 2051, 'ExtString': 2052, 'TxtQry': 2053, 'Qsir': 2054, 'Qsif': 2055, 'RRDTQSIF': 2056, 'BOF': 2057, 'OleDbConn': 2058, 'WOpt': 2059, 'SXViewEx': 2060, 'SXTH': 2061, 'SXPIEx': 2062, 'SXVDTEx': 2063, 'SXViewEx9': 2064, 'ContinueFrt': 2066, 'RealTimeData': 2067, 'ChartFrtInfo': 2128, 'FrtWrapper': 2129, 'StartBlock': 2130, 'EndBlock': 2131, 'StartObject': 2132, 'EndObject': 2133, 'CatLab': 2134, 'YMult': 2135, 'SXViewLink': 2136, 'PivotChartBits': 2137, 'FrtFontList': 2138, 'SheetExt': 2146, 'BookExt': 2147, 'SXAddl': 2148, 'CrErr': 2149, 'HFPicture': 2150, 'FeatHdr': 2151, 'Feat': 2152, 'DataLabExt': 2154, 'DataLabExtContents': 2155, 'CellWatch': 2156, 'FeatHdr11': 2161, 'Feature11': 2162, 'DropDownObjIds': 2164, 'ContinueFrt11': 2165, 'DConn': 2166, 'List12': 2167, 'Feature12': 2168, 'CondFmt12': 2169, 'CF12': 2170, 'CFEx': 2171, 'XFCRC': 2172, 'XFExt': 2173, 'AutoFilter12': 2174, 'ContinueFrt12': 2175, 'MDTInfo': 2180, 'MDXStr': 2181, 'MDXTuple': 2182, 'MDXSet': 2183, 'MDXProp': 2184, 'MDXKPI': 2185, 'MDB': 2186, 'PLV': 2187, 'Compat12': 2188, 'DXF': 2189, 'TableStyles': 2190, 'TableStyle': 2191, 'TableStyleElement': 2192, 'StyleExt': 2194, 'NamePublish': 2195, 'NameCmt': 2196, 'SortData': 2197, 'Theme': 2198, 'GUIDTypeLib': 2199, 'FnGrp12': 2200, 'NameFnGrp12': 2201, 'MTRSettings': 2202, 'CompressPictures': 2203, 'HeaderFooter': 2204, 'CrtLayout12': 2205, 'CrtMlFrt': 2206, 'CrtMlFrtContinue': 2207, 'ForceFullCalculation': 2211, 'ShapePropsStream': 2212, 'TextPropsStream': 2213, 'RichTextStream': 2214, 'CrtLayout12A': 2215, 'Units': 4097, 'Chart': 4098, 'Series': 4099, 'DataFormat': 4102, 'LineFormat': 4103, 'MarkerFormat': 4105, 'AreaFormat': 4106, 'PieFormat': 4107, 'AttachedLabel': 4108, 'SeriesText': 4109, 'ChartFormat': 4116, 'Legend': 4117, 'SeriesList': 4118, 'Bar': 4119, 'Line': 4120, 'Pie': 4121, 'Area': 4122, 'Scatter': 4123, 'CrtLine': 4124, 'Axis': 4125, 'Tick': 4126, 'ValueRange': 4127, 'CatSerRange': 4128, 'AxisLine': 4129, 'CrtLink': 4130, 'DefaultText': 4132, 'Text': 4133, 'FontX': 4134, 'ObjectLink': 4135, 'Frame': 4146, 'Begin': 4147, 'End': 4148, 'PlotArea': 4149, 'Chart3d': 4154, 'PicF': 4156, 'DropBar': 4157, 'Radar': 4158, 'Surf': 4159, 'RadarArea': 4160, 'AxisParent': 4161, 'LegendException': 4163, 'ShtProps': 4164, 'SerToCrt': 4165, 'AxesUsed': 4166, 'SBaseRef': 4168, 'SerParent': 4170, 'SerAuxTrend': 4171, 'IFmtRecord': 4174, 'Pos': 4175, 'AlRuns': 4176, 'BRAI': 4177, 'SerAuxErrBar': 4187, 'ClrtClient': 4188, 'SerFmt': 4189, 'Chart3DBarShape': 4191, 'Fbi': 4192, 'BopPop': 4193, 'AxcExt': 4194, 'Dat': 4195, 'PlotGrowth': 4196, 'SIIndex': 4197, 'GelFrame': 4198, 'BopPopCustom': 4199, 'Fbi2': 4200, } def _parse_header_RC4(encryptionInfo): # RC4: https://msdn.microsoft.com/en-us/library/dd908560(v=office.12).aspx salt = encryptionInfo.read(16) encryptedVerifier = encryptionInfo.read(16) encryptedVerifierHash = encryptionInfo.read(16) info = { 'salt': salt, 'encryptedVerifier': encryptedVerifier, 'encryptedVerifierHash': encryptedVerifierHash, } return info def _parse_header_RC4CryptoAPI(encryptionInfo): flags = encryptionInfo.read(4) headerSize, = unpack(">> f = open("tests/inputs/plain.xls", "rb") >>> file = Xls97File(f) >>> file.is_encrypted() False >>> f = open("tests/inputs/rc4cryptoapi_password.xls", "rb") >>> file = Xls97File(f) >>> file.is_encrypted() True ''' # Utilising the method above, check for encryption type. self.data.workbook.seek(0) workbook = _BIFFStream(self.data.workbook) num, = unpack(">> blob = io.BytesIO(b'\xec\xa5\xc1\x00G\x00\t\x04\x00\x00\x00\x13\xbf\x004\x00\ ... \x00\x00\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x16\x04\x00\x00') >>> fibbase = _parseFibBase(blob) >>> hex(fibbase.wIdent) '0xa5ec' >>> hex(fibbase.nFib) '0xc1' >>> hex(fibbase.fExtChar) '0x1' ''' getBit = lambda bits, i: (bits & (1 << i)) >> i getBitSlice = lambda bits, i, w: (bits & (2 ** w - 1 << i)) >> i # https://msdn.microsoft.com/en-us/library/dd944620(v=office.12).aspx buf, = unpack_from("> i blob.seek(0) buf, = unpack("> i buf, = unpack(" 0: persistdirectoryatom = persistdirectoryatom_stack.pop() for entry in persistdirectoryatom.rgPersistDirEntry: # logger.debug("persistId: %d" % entry.persistId) for i, offset in enumerate(entry.rgPersistOffset): persistobjectdirectory[entry.persistId + i] = offset return persistobjectdirectory def _parse_header_RC4CryptoAPI(encryptionInfo): flags = encryptionInfo.read(4) headerSize, = unpack(" be an encrypted document. headerToken=0xe391c05f, offsetToCurrentEdit=cuatom.offsetToCurrentEdit, lenUserName=cuatom.lenUserName, docFileVersion=cuatom.docFileVersion, majorVersion=cuatom.majorVersion, minorVersion=cuatom.minorVersion, unused=cuatom.unused, ansiUserName=cuatom.ansiUserName, relVersion=cuatom.relVersion, unicodeUserName=cuatom.unicodeUserName, ) ) buf = _packCurrentUser(currentuser_new) buf.seek(0) currentuser_buf = buf # List of encrypted parts: https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-ppt/b0963334-4408-4621-879a-ef9c54551fd8 # PowerPoint Document Stream self.data.powerpointdocument.seek(0) powerpointdocument_size = len(self.data.powerpointdocument.read()) logger.debug("[*] powerpointdocument_size: {}".format(powerpointdocument_size)) self.data.powerpointdocument.seek(0) dec_bytearray = bytearray(self.data.powerpointdocument.read()) # UserEditAtom self.data.powerpointdocument.seek(currentuser.currentuseratom.offsetToCurrentEdit) # currentuseratom_raw = self.data.powerpointdocument.read(40) self.data.powerpointdocument.seek(currentuser.currentuseratom.offsetToCurrentEdit) usereditatom = _parseUserEditAtom(self.data.powerpointdocument) # logger.debug(usereditatom) # logger.debug(["offsetToCurrentEdit", currentuser.currentuseratom.offsetToCurrentEdit]) rh_new = RecordHeader( recVer=usereditatom.rh.recVer, recInstance=usereditatom.rh.recInstance, recType=usereditatom.rh.recType, recLen=usereditatom.rh.recLen - 4, # Omit encryptSessionPersistIdRef field ) # logger.debug([_packRecordHeader(usereditatom.rh).read(), _packRecordHeader(rh_new).read()]) usereditatom_new = UserEditAtom( rh=rh_new, lastSlideIdRef=usereditatom.lastSlideIdRef, version=usereditatom.version, minorVersion=usereditatom.minorVersion, majorVersion=usereditatom.majorVersion, offsetLastEdit=usereditatom.offsetLastEdit, offsetPersistDirectory=usereditatom.offsetPersistDirectory, docPersistIdRef=usereditatom.docPersistIdRef, persistIdSeed=usereditatom.persistIdSeed, lastView=usereditatom.lastView, unused=usereditatom.unused, encryptSessionPersistIdRef=0x00000000, # Clear ) # logger.debug(currentuseratom_raw) # logger.debug(_packUserEditAtom(usereditatom).read()) # logger.debug(_packUserEditAtom(usereditatom_new).read()) buf = _packUserEditAtom(usereditatom_new) buf.seek(0) buf_bytes = bytearray(buf.read()) offset = currentuser.currentuseratom.offsetToCurrentEdit dec_bytearray[offset:offset+len(buf_bytes)] = buf_bytes # PersistDirectoryAtom self.data.powerpointdocument.seek(currentuser.currentuseratom.offsetToCurrentEdit) usereditatom = _parseUserEditAtom(self.data.powerpointdocument) # logger.debug(usereditatom) self.data.powerpointdocument.seek(usereditatom.offsetPersistDirectory) persistdirectoryatom = _parsePersistDirectoryAtom(self.data.powerpointdocument) # logger.debug(persistdirectoryatom) persistdirectoryatom_new = PersistDirectoryAtom( rh=persistdirectoryatom.rh, rgPersistDirEntry=[ PersistDirectoryEntry( persistId=persistdirectoryatom.rgPersistDirEntry[0].persistId, # Omit CryptSession10Container cPersist=persistdirectoryatom.rgPersistDirEntry[0].cPersist-1, rgPersistOffset=persistdirectoryatom.rgPersistDirEntry[0].rgPersistOffset, ), ], ) self.data.powerpointdocument.seek(usereditatom.offsetPersistDirectory) buf = _packPersistDirectoryAtom(persistdirectoryatom_new) buf_bytes = bytearray(buf.read()) offset = usereditatom.offsetPersistDirectory dec_bytearray[offset:offset+len(buf_bytes)] = buf_bytes # Persist Objects self.data.powerpointdocument.seek(0) persistobjectdirectory = construct_persistobjectdirectory(self.data) directory_items = list(persistobjectdirectory.items()) for i, (persistId, offset) in enumerate(directory_items): self.data.powerpointdocument.seek(offset) buf = self.data.powerpointdocument.read(8) rh = _parseRecordHeader(io.BytesIO(buf)) logger.debug("[*] rh: {}".format(rh)) # CryptSession10Container if rh.recType == 0x2f14: logger.debug("[*] CryptSession10Container found") # Remove encryption, pad by zero to preserve stream size dec_bytearray[offset:offset+(8+rh.recLen)] = b"\x00" * (8+rh.recLen) continue # The UserEditAtom record (section 2.3.3) and the PersistDirectoryAtom record (section 2.3.4) MUST NOT be encrypted. if rh.recType in [0x0ff5, 0x1772]: logger.debug("[*] UserEditAtom/PersistDirectoryAtom found") continue # TODO: Fix here recLen = directory_items[i+1][1] - offset - 8 logger.debug("[*] recLen: {}".format(recLen)) self.data.powerpointdocument.seek(offset) enc_buf = io.BytesIO(self.data.powerpointdocument.read(8+recLen)) blocksize = self.keySize * ((8 + recLen) // self.keySize + 1) # Undocumented dec = DocumentRC4CryptoAPI.decrypt(self.key, self.salt, self.keySize, enc_buf, blocksize=blocksize, block=persistId) dec_bytes = bytearray(dec.read()) dec_bytearray[offset:offset+len(dec_bytes)] = dec_bytes # To BytesIO dec_buf = io.BytesIO(dec_bytearray) dec_buf.seek(0) for i, (persistId, offset) in enumerate(directory_items): dec_buf.seek(offset) buf = dec_buf.read(8) rh = _parseRecordHeader(io.BytesIO(buf)) logger.debug("[*] rh: {}".format(rh)) dec_buf.seek(0) logger.debug("[*] powerpointdocument_size={}, len(dec_buf.read())={}".format(powerpointdocument_size, len(dec_buf.read()))) dec_buf.seek(0) powerpointdocument_dec_buf = dec_buf # TODO: Pictures Stream # TODO: Encrypted Summary Info Stream with tempfile.TemporaryFile() as _ofile: self.file.seek(0) shutil.copyfileobj(self.file, _ofile) outole = olefile.OleFileIO(_ofile, write_mode=True) outole.write_stream('Current User', currentuser_buf.read()) outole.write_stream('PowerPoint Document', powerpointdocument_dec_buf.read()) # Finalize _ofile.seek(0) shutil.copyfileobj(_ofile, ofile) return def is_encrypted(self): r''' Test if the file is encrypted. >>> f = open("tests/inputs/plain.ppt", "rb") >>> file = Ppt97File(f) >>> file.is_encrypted() False >>> f = open("tests/inputs/rc4cryptoapi_password.ppt", "rb") >>> file = Ppt97File(f) >>> file.is_encrypted() True ''' self.data.currentuser.seek(0) currentuser = _parseCurrentUser(self.data.currentuser) logger.debug("[*] currentuser: {}".format(currentuser)) self.data.powerpointdocument.seek(currentuser.currentuseratom.offsetToCurrentEdit) usereditatom = _parseUserEditAtom(self.data.powerpointdocument) logger.debug("[*] usereditatom: {}".format(usereditatom)) if usereditatom.rh.recLen == 0x00000020: # Cf. _parseUserEditAtom return True else: return False msoffcrypto-tool-4.10.1/msoffcrypto/format/base.py0000664000372000037200000000061613520721054023116 0ustar travistravis00000000000000import abc # For 2 and 3 compatibility # https://stackoverflow.com/questions/35673474/ ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) class BaseOfficeFile(ABC): def __init__(self): pass @abc.abstractmethod def load_key(self): pass @abc.abstractmethod def decrypt(self): pass @abc.abstractmethod def is_encrypted(self): pass msoffcrypto-tool-4.10.1/msoffcrypto/format/__init__.py0000664000372000037200000000000013520721054023726 0ustar travistravis00000000000000msoffcrypto-tool-4.10.1/msoffcrypto/__init__.py0000664000372000037200000000372613520721054022460 0ustar travistravis00000000000000import olefile import zipfile __version__ = "4.10.1" def OfficeFile(file): '''Return an office file object based on the format of given file. Args: file (:obj:`_io.BufferedReader`): Input file. Returns: BaseOfficeFile object. Examples: >>> with open("tests/inputs/example_password.docx", "rb") as f: ... officefile = OfficeFile(f) ... officefile.keyTypes ('password', 'private_key', 'secret_key') Given file handle will not be closed, the file position will most certainly change. ''' file.seek(0) # required by isOleFile if olefile.isOleFile(file): ole = olefile.OleFileIO(file) elif zipfile.is_zipfile(file): # Heuristic from .format.ooxml import OOXMLFile return OOXMLFile(file) else: raise Exception("Unsupported file format") # TODO: Make format specifiable by option in case of obstruction # Try this first; see https://github.com/nolze/msoffcrypto-tool/issues/17 if ole.exists('EncryptionInfo'): from .format.ooxml import OOXMLFile return OOXMLFile(file) # MS-DOC: The WordDocument stream MUST be present in the file. # https://msdn.microsoft.com/en-us/library/dd926131(v=office.12).aspx elif ole.exists('wordDocument'): from .format.doc97 import Doc97File return Doc97File(file) # MS-XLS: A file MUST contain exactly one Workbook Stream, ... # https://msdn.microsoft.com/en-us/library/dd911009(v=office.12).aspx elif ole.exists('Workbook'): from .format.xls97 import Xls97File return Xls97File(file) # MS-PPT: A required stream whose name MUST be "PowerPoint Document". # https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-ppt/1fc22d56-28f9-4818-bd45-67c2bf721ccf elif ole.exists('PowerPoint Document'): from .format.ppt97 import Ppt97File return Ppt97File(file) else: raise Exception("Unrecognized file format") msoffcrypto-tool-4.10.1/msoffcrypto/method/0000775000372000037200000000000013520721121021612 5ustar travistravis00000000000000msoffcrypto-tool-4.10.1/msoffcrypto/method/ecma376_agile.py0000664000372000037200000000733413520721054024506 0ustar travistravis00000000000000import logging import hashlib, functools, io from struct import pack, unpack from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) def _hashCalc(i, algorithm): if algorithm == "SHA512": return hashlib.sha512(i) else: return hashlib.sha1(i) class ECMA376Agile: def __init__(self): pass @staticmethod def decrypt(key, keyDataSalt, hashAlgorithm, ibuf): r''' Return decrypted data. >>> key = b'@ f\t\xd9\xfa\xad\xf2K\x07j\xeb\xf2\xc45\xb7B\x92\xc8\xb8\xa7\xaa\x81\xbcg\x9b\xe8\x97\x11\xb0*\xc2' >>> keyDataSalt = b'\x8f\xc7x"+P\x8d\xdcL\xe6\x8c\xdd\x15<\x16\xb4' >>> hashAlgorithm = 'SHA512' ''' SEGMENT_LENGTH = 4096 obuf = io.BytesIO() totalSize = unpack('>> password = 'Password1234_' >>> saltValue = b'Lr]E\xdca\x0f\x93\x94\x12\xa0M\xa7\x91\x04f' >>> hashAlgorithm = 'SHA512' >>> encryptedKeyValue = b"\xa1l\xd5\x16Zz\xb9\xd2q\x11>\xd3\x86\xa7\x8c\xf4\x96\x92\xe8\xe5'\xb0\xc5\xfc\x00U\xed\x08\x0b|\xb9K" >>> spinValue = 100000 >>> keyBits = 256 >>> expected = b'@ f\t\xd9\xfa\xad\xf2K\x07j\xeb\xf2\xc45\xb7B\x92\xc8\xb8\xa7\xaa\x81\xbcg\x9b\xe8\x97\x11\xb0*\xc2' >>> ECMA376Agile.makekey_from_password(password, saltValue, hashAlgorithm, encryptedKeyValue, spinValue, keyBits) == expected True ''' block3 = bytearray([0x14, 0x6e, 0x0b, 0xe7, 0xab, 0xac, 0xd0, 0xd6]) # Initial round sha512(salt + password) h = _hashCalc(saltValue + password.encode("UTF-16LE"), hashAlgorithm) # Iteration of 0 -> spincount-1; hash = sha512(iterator + hash) for i in range(0, spinValue, 1): h = _hashCalc(pack(">> key = b'@\xb1:q\xf9\x0b\x96n7T\x08\xf2\xd1\x81\xa1\xaa' >>> encryptedVerifier = b'Qos.\x96o\xac\x17\xb1\xc5\xd7\xd8\xcc6\xc9(' >>> encryptedVerifierHash = b'+ah\xda\xbe)\x11\xad+\xd3|\x17Ft\\\x14\xd3\xcf\x1b\xb1@\xa4\x8fNo=#\x88\x08r\xb1j' >>> ECMA376Standard.verifykey(key, encryptedVerifier, encryptedVerifierHash) True ''' logger.debug([key, encryptedVerifier, encryptedVerifierHash]) # https://msdn.microsoft.com/en-us/library/dd926426(v=office.12).aspx aes = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend()) decryptor = aes.decryptor() verifier = decryptor.update(encryptedVerifier) hash = sha1(verifier).digest() decryptor = aes.decryptor() verifierHash = decryptor.update(encryptedVerifierHash)[:sha1().digest_size] logging.debug([hash, verifierHash]) return hash == verifierHash @staticmethod def makekey_from_password(password, algId, algIdHash, providerType, keySize, saltSize, salt): r''' Generate intermediate key from given password. >>> password = 'Password1234_' >>> algId = 0x660e >>> algIdHash = 0x8004 >>> providerType = 0x18 >>> keySize = 128 >>> saltSize = 16 >>> salt = b'\xe8\x82fI\x0c[\xd1\xee\xbd+C\x94\xe3\xf80\xef' >>> expected = b'@\xb1:q\xf9\x0b\x96n7T\x08\xf2\xd1\x81\xa1\xaa' >>> ECMA376Standard.makekey_from_password(password, algId, algIdHash, providerType, keySize, saltSize, salt) == expected True ''' logger.debug([password, hex(algId), hex(algIdHash), hex(providerType), keySize, saltSize, salt]) xor_bytes = lambda a, b: bytearray([p ^ q for p, q in zip(bytearray(a), bytearray(b))]) # bytearray() for Python 2 compat. # https://msdn.microsoft.com/en-us/library/dd925430(v=office.12).aspx ITER_COUNT = 50000 password = password.encode("UTF-16LE") h = sha1(salt + password).digest() for i in range(ITER_COUNT): ibytes = pack(">> password = 'password1' >>> salt = b'\xe8w,\x1d\x91\xc5j7\x96Ga\xb2\x80\x182\x17' >>> block = 0 >>> expected = b' \xbf2\xdd\xf5@\x85\x8cQ7D\xaf\x0f$\xe0<' >>> _makekey(password, salt, block) == expected True ''' # https://msdn.microsoft.com/en-us/library/dd920360(v=office.12).aspx password = password.encode("UTF-16LE") h0 = md5(password).digest() truncatedHash = h0[:5] intermediateBuffer = (truncatedHash + salt) * 16 h1 = md5(intermediateBuffer).digest() truncatedHash = h1[:5] blockbytes = pack(">> password = 'password1' >>> salt = b'\xe8w,\x1d\x91\xc5j7\x96Ga\xb2\x80\x182\x17' >>> encryptedVerifier = b'\xc9\xe9\x97\xd4T\x97=1\x0b\xb1\xbap\x14&\x83~' >>> encryptedVerifierHash = b'\xb1\xde\x17\x8f\x07\xe9\x89\xc4M\xae^L\xf9j\xc4\x07' >>> DocumentRC4.verifypw(password, salt, encryptedVerifier, encryptedVerifierHash) True ''' # https://msdn.microsoft.com/en-us/library/dd952648(v=office.12).aspx block = 0 key = _makekey(password, salt, block) cipher = Cipher(algorithms.ARC4(key), mode=None, backend=default_backend()) decryptor = cipher.decryptor() verifier = decryptor.update(encryptedVerifier) verfiferHash = decryptor.update(encryptedVerifierHash) hash = md5(verifier).digest() logging.debug([verfiferHash, hash]) return hash == verfiferHash @staticmethod def decrypt(password, salt, ibuf, blocksize=0x200): r''' Return decrypted data. ''' obuf = io.BytesIO() block = 0 key = _makekey(password, salt, block) for c, buf in enumerate(iter(functools.partial(ibuf.read, blocksize), b'')): cipher = Cipher(algorithms.ARC4(key), mode=None, backend=default_backend()) decryptor = cipher.decryptor() dec = decryptor.update(buf) + decryptor.finalize() obuf.write(dec) # From wvDecrypt: # at this stage we need to rekey the rc4 algorithm # Dieter Spaar figured out # this rekeying, big kudos to him block += 1 key = _makekey(password, salt, block) obuf.seek(0) return obuf msoffcrypto-tool-4.10.1/msoffcrypto/method/__init__.py0000664000372000037200000000000013520721054023716 0ustar travistravis00000000000000msoffcrypto-tool-4.10.1/msoffcrypto/method/rc4_cryptoapi.py0000664000372000037200000000456413520721054024764 0ustar travistravis00000000000000import functools, io, logging from hashlib import sha1 from struct import pack from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.ciphers import Cipher, algorithms logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) def _makekey(password, salt, keyLength, block, algIdHash=0x00008004): r''' Return a intermediate key. ''' # https://msdn.microsoft.com/en-us/library/dd920677(v=office.12).aspx password = password.encode("UTF-16LE") h0 = sha1(salt + password).digest() blockbytes = pack(" figured out # this rekeying, big kudos to him block += 1 key = _makekey(password, salt, keySize, block) obuf.seek(0) return obuf msoffcrypto-tool-4.10.1/msoffcrypto/method/xor_obfuscation.py0000664000372000037200000000000013520721054025363 0ustar travistravis00000000000000msoffcrypto-tool-4.10.1/LICENSE.txt0000664000372000037200000000204513520721054017610 0ustar travistravis00000000000000MIT License Copyright (c) 2015 nolze Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.msoffcrypto-tool-4.10.1/PKG-INFO0000664000372000037200000001534713520721121017066 0ustar travistravis00000000000000Metadata-Version: 2.1 Name: msoffcrypto-tool Version: 4.10.1 Summary: A Python tool and library for decrypting MS Office files with passwords or other keys Home-page: https://github.com/nolze/msoffcrypto-tool Author: nolze Author-email: nolze@archlinux.us License: MIT Description: # msoffcrypto-tool [![PyPI version](https://badge.fury.io/py/msoffcrypto-tool.svg)](https://badge.fury.io/py/msoffcrypto-tool) [![PyPI downloads](https://img.shields.io/pypi/dm/msoffcrypto-tool.svg)](https://pypistats.org/packages/msoffcrypto-tool) [![Build Status](https://travis-ci.org/nolze/msoffcrypto-tool.svg?branch=master)](https://travis-ci.org/nolze/msoffcrypto-tool) [![Coverage Status](https://codecov.io/gh/nolze/msoffcrypto-tool/branch/master/graph/badge.svg)](https://codecov.io/gh/nolze/msoffcrypto-tool) [![Documentation Status](https://readthedocs.org/projects/msoffcrypto-tool/badge/?version=latest)](http://msoffcrypto-tool.readthedocs.io/en/latest/?badge=latest) msoffcrypto-tool (formerly ms-offcrypto-tool) is a Python tool and library for decrypting encrypted MS Office files with password, intermediate key, or private key which generated its escrow key. ## Contents * [Install](#install) * [Examples](#examples) * [Supported encryption methods](#supported-encryption-methods) * [Tests](#tests) * [Todo](#todo) * [References](#references) * [Use cases and mentions](#use-cases-and-mentions) * [Contributors](#contributors) ## Install ``` pip install msoffcrypto-tool ``` ## Examples ### As CLI tool (with password) ``` msoffcrypto-tool encrypted.docx decrypted.docx -p Passw0rd ``` Password is prompted if you omit the password argument value: ```bash $ msoffcrypto-tool encrypted.docx decrypted.docx -p Password: ``` Test if the file is encrypted or not (exit code 0 or 1 is returned): ``` msoffcrypto-tool document.doc --test -v ``` ### As library Password and more key types are supported with library functions. ```python import msoffcrypto file = msoffcrypto.OfficeFile(open("encrypted.docx", "rb")) # Use password file.load_key(password="Passw0rd") # Use private key # file.load_key(private_key=open("priv.pem", "rb")) # Use intermediate key (secretKey) # file.load_key(secret_key=binascii.unhexlify("AE8C36E68B4BB9EA46E5544A5FDB6693875B2FDE1507CBC65C8BCF99E25C2562")) file.decrypt(open("decrypted.docx", "wb")) ``` ## Supported encryption methods ### MS-OFFCRYPTO specs * [x] ECMA-376 (Agile Encryption/Standard Encryption) * [x] MS-DOCX (OOXML) (Word 2007-2016) * [x] MS-XLSX (OOXML) (Excel 2007-2016) * [x] MS-PPTX (OOXML) (PowerPoint 2007-2016) * [x] Office Binary Document RC4 CryptoAPI * [x] MS-DOC (Word 2002, 2003, 2004) * [x] MS-XLS (Excel 2002, 2003, 2004) (experimental) * [x] MS-PPT (PowerPoint 2002, 2003, 2004) (partial, experimental) * [x] Office Binary Document RC4 * [x] MS-DOC (Word 97, 98, 2000) * [x] MS-XLS (Excel 97, 98, 2000) (experimental) * [ ] ECMA-376 (Extensible Encryption) * [ ] XOR Obfuscation ### Other * [ ] Word 95 Encryption (Word 95 and prior) * [ ] Excel 95 Encryption (Excel 95 and prior) * [ ] PowerPoint 95 Encryption (PowerPoint 95 and prior) PRs are welcome! ## Tests Tests can be run in various ways: * `python -m nose -c .noserc` * `nosetests -c .noserc` * `python -m unittest discover` * `python setup.py test` * `./tests/test_cli.sh` If the [cryptography](https://pypi.org/project/cryptography/) package is not installed, tests are skipped. If you have dependencies installed only for a certain python version, replace "python" with "pythonX.Y" in the above commands. ## Todo * [x] Add tests * [x] Support decryption with passwords * [x] Support older encryption schemes * [x] Add function-level tests * [x] Add API documents * [x] Publish to PyPI * [x] Add decryption tests for various file formats * [x] Integrate with more comprehensive projects handling MS Office files (such as [oletools](https://github.com/decalage2/oletools/)?) if possible * [x] Add the password prompt mode for CLI * [ ] Redesign APIs (v5.0.0) * [ ] Improve error types (v5.0.0) * [ ] Use a kind of `ctypes.Structure` * [ ] Support encryption ## See also * "Backdooring MS Office documents with secret master keys" * Technical Documents * [MS-OFFCRYPTO] Agile Encryption * LibreOffice/core * LibreOffice/mso-dumper * wvDecrypt * Microsoft Office password protection - Wikipedia * office2john.py ## Alternatives * herumi/msoffice * DocRecrypt * Apache POI - the Java API for Microsoft Documents ## Use cases and mentions * * * * ## Contributors * Platform: UNKNOWN Description-Content-Type: text/markdown msoffcrypto-tool-4.10.1/README.md0000664000372000037200000001235213520721054017246 0ustar travistravis00000000000000# msoffcrypto-tool [![PyPI version](https://badge.fury.io/py/msoffcrypto-tool.svg)](https://badge.fury.io/py/msoffcrypto-tool) [![PyPI downloads](https://img.shields.io/pypi/dm/msoffcrypto-tool.svg)](https://pypistats.org/packages/msoffcrypto-tool) [![Build Status](https://travis-ci.org/nolze/msoffcrypto-tool.svg?branch=master)](https://travis-ci.org/nolze/msoffcrypto-tool) [![Coverage Status](https://codecov.io/gh/nolze/msoffcrypto-tool/branch/master/graph/badge.svg)](https://codecov.io/gh/nolze/msoffcrypto-tool) [![Documentation Status](https://readthedocs.org/projects/msoffcrypto-tool/badge/?version=latest)](http://msoffcrypto-tool.readthedocs.io/en/latest/?badge=latest) msoffcrypto-tool (formerly ms-offcrypto-tool) is a Python tool and library for decrypting encrypted MS Office files with password, intermediate key, or private key which generated its escrow key. ## Contents * [Install](#install) * [Examples](#examples) * [Supported encryption methods](#supported-encryption-methods) * [Tests](#tests) * [Todo](#todo) * [References](#references) * [Use cases and mentions](#use-cases-and-mentions) * [Contributors](#contributors) ## Install ``` pip install msoffcrypto-tool ``` ## Examples ### As CLI tool (with password) ``` msoffcrypto-tool encrypted.docx decrypted.docx -p Passw0rd ``` Password is prompted if you omit the password argument value: ```bash $ msoffcrypto-tool encrypted.docx decrypted.docx -p Password: ``` Test if the file is encrypted or not (exit code 0 or 1 is returned): ``` msoffcrypto-tool document.doc --test -v ``` ### As library Password and more key types are supported with library functions. ```python import msoffcrypto file = msoffcrypto.OfficeFile(open("encrypted.docx", "rb")) # Use password file.load_key(password="Passw0rd") # Use private key # file.load_key(private_key=open("priv.pem", "rb")) # Use intermediate key (secretKey) # file.load_key(secret_key=binascii.unhexlify("AE8C36E68B4BB9EA46E5544A5FDB6693875B2FDE1507CBC65C8BCF99E25C2562")) file.decrypt(open("decrypted.docx", "wb")) ``` ## Supported encryption methods ### MS-OFFCRYPTO specs * [x] ECMA-376 (Agile Encryption/Standard Encryption) * [x] MS-DOCX (OOXML) (Word 2007-2016) * [x] MS-XLSX (OOXML) (Excel 2007-2016) * [x] MS-PPTX (OOXML) (PowerPoint 2007-2016) * [x] Office Binary Document RC4 CryptoAPI * [x] MS-DOC (Word 2002, 2003, 2004) * [x] MS-XLS (Excel 2002, 2003, 2004) (experimental) * [x] MS-PPT (PowerPoint 2002, 2003, 2004) (partial, experimental) * [x] Office Binary Document RC4 * [x] MS-DOC (Word 97, 98, 2000) * [x] MS-XLS (Excel 97, 98, 2000) (experimental) * [ ] ECMA-376 (Extensible Encryption) * [ ] XOR Obfuscation ### Other * [ ] Word 95 Encryption (Word 95 and prior) * [ ] Excel 95 Encryption (Excel 95 and prior) * [ ] PowerPoint 95 Encryption (PowerPoint 95 and prior) PRs are welcome! ## Tests Tests can be run in various ways: * `python -m nose -c .noserc` * `nosetests -c .noserc` * `python -m unittest discover` * `python setup.py test` * `./tests/test_cli.sh` If the [cryptography](https://pypi.org/project/cryptography/) package is not installed, tests are skipped. If you have dependencies installed only for a certain python version, replace "python" with "pythonX.Y" in the above commands. ## Todo * [x] Add tests * [x] Support decryption with passwords * [x] Support older encryption schemes * [x] Add function-level tests * [x] Add API documents * [x] Publish to PyPI * [x] Add decryption tests for various file formats * [x] Integrate with more comprehensive projects handling MS Office files (such as [oletools](https://github.com/decalage2/oletools/)?) if possible * [x] Add the password prompt mode for CLI * [ ] Redesign APIs (v5.0.0) * [ ] Improve error types (v5.0.0) * [ ] Use a kind of `ctypes.Structure` * [ ] Support encryption ## See also * "Backdooring MS Office documents with secret master keys" * Technical Documents * [MS-OFFCRYPTO] Agile Encryption * LibreOffice/core * LibreOffice/mso-dumper * wvDecrypt * Microsoft Office password protection - Wikipedia * office2john.py ## Alternatives * herumi/msoffice * DocRecrypt * Apache POI - the Java API for Microsoft Documents ## Use cases and mentions * * * * ## Contributors * msoffcrypto-tool-4.10.1/msoffcrypto_tool.egg-info/0000775000372000037200000000000013520721121023061 5ustar travistravis00000000000000msoffcrypto-tool-4.10.1/msoffcrypto_tool.egg-info/PKG-INFO0000664000372000037200000001534713520721121024170 0ustar travistravis00000000000000Metadata-Version: 2.1 Name: msoffcrypto-tool Version: 4.10.1 Summary: A Python tool and library for decrypting MS Office files with passwords or other keys Home-page: https://github.com/nolze/msoffcrypto-tool Author: nolze Author-email: nolze@archlinux.us License: MIT Description: # msoffcrypto-tool [![PyPI version](https://badge.fury.io/py/msoffcrypto-tool.svg)](https://badge.fury.io/py/msoffcrypto-tool) [![PyPI downloads](https://img.shields.io/pypi/dm/msoffcrypto-tool.svg)](https://pypistats.org/packages/msoffcrypto-tool) [![Build Status](https://travis-ci.org/nolze/msoffcrypto-tool.svg?branch=master)](https://travis-ci.org/nolze/msoffcrypto-tool) [![Coverage Status](https://codecov.io/gh/nolze/msoffcrypto-tool/branch/master/graph/badge.svg)](https://codecov.io/gh/nolze/msoffcrypto-tool) [![Documentation Status](https://readthedocs.org/projects/msoffcrypto-tool/badge/?version=latest)](http://msoffcrypto-tool.readthedocs.io/en/latest/?badge=latest) msoffcrypto-tool (formerly ms-offcrypto-tool) is a Python tool and library for decrypting encrypted MS Office files with password, intermediate key, or private key which generated its escrow key. ## Contents * [Install](#install) * [Examples](#examples) * [Supported encryption methods](#supported-encryption-methods) * [Tests](#tests) * [Todo](#todo) * [References](#references) * [Use cases and mentions](#use-cases-and-mentions) * [Contributors](#contributors) ## Install ``` pip install msoffcrypto-tool ``` ## Examples ### As CLI tool (with password) ``` msoffcrypto-tool encrypted.docx decrypted.docx -p Passw0rd ``` Password is prompted if you omit the password argument value: ```bash $ msoffcrypto-tool encrypted.docx decrypted.docx -p Password: ``` Test if the file is encrypted or not (exit code 0 or 1 is returned): ``` msoffcrypto-tool document.doc --test -v ``` ### As library Password and more key types are supported with library functions. ```python import msoffcrypto file = msoffcrypto.OfficeFile(open("encrypted.docx", "rb")) # Use password file.load_key(password="Passw0rd") # Use private key # file.load_key(private_key=open("priv.pem", "rb")) # Use intermediate key (secretKey) # file.load_key(secret_key=binascii.unhexlify("AE8C36E68B4BB9EA46E5544A5FDB6693875B2FDE1507CBC65C8BCF99E25C2562")) file.decrypt(open("decrypted.docx", "wb")) ``` ## Supported encryption methods ### MS-OFFCRYPTO specs * [x] ECMA-376 (Agile Encryption/Standard Encryption) * [x] MS-DOCX (OOXML) (Word 2007-2016) * [x] MS-XLSX (OOXML) (Excel 2007-2016) * [x] MS-PPTX (OOXML) (PowerPoint 2007-2016) * [x] Office Binary Document RC4 CryptoAPI * [x] MS-DOC (Word 2002, 2003, 2004) * [x] MS-XLS (Excel 2002, 2003, 2004) (experimental) * [x] MS-PPT (PowerPoint 2002, 2003, 2004) (partial, experimental) * [x] Office Binary Document RC4 * [x] MS-DOC (Word 97, 98, 2000) * [x] MS-XLS (Excel 97, 98, 2000) (experimental) * [ ] ECMA-376 (Extensible Encryption) * [ ] XOR Obfuscation ### Other * [ ] Word 95 Encryption (Word 95 and prior) * [ ] Excel 95 Encryption (Excel 95 and prior) * [ ] PowerPoint 95 Encryption (PowerPoint 95 and prior) PRs are welcome! ## Tests Tests can be run in various ways: * `python -m nose -c .noserc` * `nosetests -c .noserc` * `python -m unittest discover` * `python setup.py test` * `./tests/test_cli.sh` If the [cryptography](https://pypi.org/project/cryptography/) package is not installed, tests are skipped. If you have dependencies installed only for a certain python version, replace "python" with "pythonX.Y" in the above commands. ## Todo * [x] Add tests * [x] Support decryption with passwords * [x] Support older encryption schemes * [x] Add function-level tests * [x] Add API documents * [x] Publish to PyPI * [x] Add decryption tests for various file formats * [x] Integrate with more comprehensive projects handling MS Office files (such as [oletools](https://github.com/decalage2/oletools/)?) if possible * [x] Add the password prompt mode for CLI * [ ] Redesign APIs (v5.0.0) * [ ] Improve error types (v5.0.0) * [ ] Use a kind of `ctypes.Structure` * [ ] Support encryption ## See also * "Backdooring MS Office documents with secret master keys" * Technical Documents * [MS-OFFCRYPTO] Agile Encryption * LibreOffice/core * LibreOffice/mso-dumper * wvDecrypt * Microsoft Office password protection - Wikipedia * office2john.py ## Alternatives * herumi/msoffice * DocRecrypt * Apache POI - the Java API for Microsoft Documents ## Use cases and mentions * * * * ## Contributors * Platform: UNKNOWN Description-Content-Type: text/markdown msoffcrypto-tool-4.10.1/msoffcrypto_tool.egg-info/dependency_links.txt0000664000372000037200000000000113520721121027127 0ustar travistravis00000000000000 msoffcrypto-tool-4.10.1/msoffcrypto_tool.egg-info/top_level.txt0000664000372000037200000000001413520721121025606 0ustar travistravis00000000000000msoffcrypto msoffcrypto-tool-4.10.1/msoffcrypto_tool.egg-info/SOURCES.txt0000664000372000037200000000262013520721121024745 0ustar travistravis00000000000000.noserc LICENSE.txt MANIFEST.in README.md setup.py msoffcrypto/__init__.py msoffcrypto/__main__.py msoffcrypto/format/__init__.py msoffcrypto/format/base.py msoffcrypto/format/common.py msoffcrypto/format/doc97.py msoffcrypto/format/ooxml.py msoffcrypto/format/ppt97.py msoffcrypto/format/xls97.py msoffcrypto/method/__init__.py msoffcrypto/method/ecma376_agile.py msoffcrypto/method/ecma376_extensible.py msoffcrypto/method/ecma376_standard.py msoffcrypto/method/rc4.py msoffcrypto/method/rc4_cryptoapi.py msoffcrypto/method/xor_obfuscation.py msoffcrypto_tool.egg-info/PKG-INFO msoffcrypto_tool.egg-info/SOURCES.txt msoffcrypto_tool.egg-info/dependency_links.txt msoffcrypto_tool.egg-info/entry_points.txt msoffcrypto_tool.egg-info/requires.txt msoffcrypto_tool.egg-info/top_level.txt tests/__init__.py tests/test_cli.sh tests/test_compare_known_output.py tests/test_file_handle.py tests/inputs/ecma376standard_password.docx tests/inputs/example_password.docx tests/inputs/example_password.xlsx tests/inputs/plain.doc tests/inputs/plain.ppt tests/inputs/plain.xls tests/inputs/rc4cryptoapi_password.doc tests/inputs/rc4cryptoapi_password.ppt tests/inputs/rc4cryptoapi_password.xls tests/outputs/ecma376standard_password_plain.docx tests/outputs/example.docx tests/outputs/example.xlsx tests/outputs/rc4cryptoapi_password_plain.doc tests/outputs/rc4cryptoapi_password_plain.ppt tests/outputs/rc4cryptoapi_password_plain.xlsmsoffcrypto-tool-4.10.1/msoffcrypto_tool.egg-info/requires.txt0000664000372000037200000000004013520721121025453 0ustar travistravis00000000000000olefile>=0.45 cryptography>=2.3 msoffcrypto-tool-4.10.1/msoffcrypto_tool.egg-info/entry_points.txt0000664000372000037200000000010013520721121026346 0ustar travistravis00000000000000[console_scripts] msoffcrypto-tool = msoffcrypto.__main__:main msoffcrypto-tool-4.10.1/.noserc0000664000372000037200000000012213520721054017251 0ustar travistravis00000000000000[nosetests] with-doctest=1 with-coverage=1 cover-package=msoffcrypto verbosity=2 msoffcrypto-tool-4.10.1/setup.cfg0000664000372000037200000000004613520721121017600 0ustar travistravis00000000000000[egg_info] tag_build = tag_date = 0 msoffcrypto-tool-4.10.1/setup.py0000664000372000037200000000270013520721054017475 0ustar travistravis00000000000000from setuptools import setup import codecs import os import re here = os.path.abspath(os.path.dirname(__file__)) def read(*parts): with codecs.open(os.path.join(here, *parts), 'r') as fp: return fp.read() # https://packaging.python.org/guides/single-sourcing-package-version/ def find_version(*file_paths): version_file = read(*file_paths) version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", version_file, re.M) if version_match: return version_match.group(1) raise RuntimeError("Unable to find version string.") setup( name='msoffcrypto-tool', version=find_version("msoffcrypto", "__init__.py"), description='A Python tool and library for decrypting MS Office files with passwords or other keys', long_description=open("README.md", "r").read(), long_description_content_type='text/markdown', url='https://github.com/nolze/msoffcrypto-tool', author='nolze', author_email='nolze@archlinux.us', license='MIT', keywords='', packages=[ "msoffcrypto", "msoffcrypto.format", "msoffcrypto.method", ], install_requires=[ 'olefile >= 0.45', 'cryptography >= 2.3', ], tests_require=[ 'nose >= 1.3.7', 'coverage >= 4.5.1', ], classifiers=[ ], entry_points={ 'console_scripts': [ 'msoffcrypto-tool = msoffcrypto.__main__:main', ], }, ) msoffcrypto-tool-4.10.1/tests/0000775000372000037200000000000013520721121017121 5ustar travistravis00000000000000msoffcrypto-tool-4.10.1/tests/outputs/0000775000372000037200000000000013520721121020644 5ustar travistravis00000000000000msoffcrypto-tool-4.10.1/tests/outputs/rc4cryptoapi_password_plain.xls0000664000372000037200000006200013520721054027127 0ustar travistravis00000000000000ࡱ> 0/ '\pMicrosoft Office User Ba==|mB8X@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri""#,##0_);\(""#,##0\)!""#,##0_);[Red]\(""#,##0\)"""#,##0.00_);\(""#,##0.00\)'"""#,##0.00_);[Red]\(""#,##0.00\)7*2_(""* #,##0_);_(""* \(#,##0\);_(""* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_(""* #,##0.00_);_(""* \(#,##0.00\);_(""* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>  ||>h }-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 W00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)    }}9 ???00\);_(*;_(@_) ??? ??? ??? ???}}) }00\);_(*;_(@_)    }A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ??? ???}-}= 00\);_(*}}8 00\);_(*;_(@_)    }-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 Dr % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 [ % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%Dr2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %DrDr= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight16`;Sheet1a| lorem ipsum . cc  PK![Content_Types].xmlN0EH-J@%ǎǢ|ș$زULTB l,3;rØJB+$G]7O٭VGR.e1a$n%N91G7Z(Lj$>{ҿQ>HjlIh촪b-{gv|g'=/:~E[7 r!7\&0;9$4 kas6r}SXi٬ kGAsPZxC}s7T A`?^R|{֯A)oViנt] f9dQ)/P yt),b-FO@)$zh QGpED 0\UF:W@?i i !SNy?yW޼W6Veda?~ǗH }˯S+.Lۯ_:w9:1c# $BĒ@v_#m' xg:J3F{; pOeXxJ=B5w%%WRُE!ED `)Ǝ}Nec2L>'^I& B ڲǨk|f#a[ ?2(v?B2r O/0epp<^ ø~Lױ䒜t!L䀝#/]1I"8EC&]cf~@^w?!rcH&"@7+̬aWʮ]N[->˜s4{A--FU+";V{IMGDX!; z+Q#O}i!T9g*}@&>itWYK w忋1ؗO-ؗ /-ݔym&Z3A`-X/DT]b+޴1$l~ڞ8vix܊uVg_J9jpۚZ%1Tݜu\w5}Wo/_2:^Ƈ㺗NV>N/S/٨ӎG{|ұ\S|$_4 *9}܉#en8#,Dz!%pbc6KO:UuVVd1^ q8),NrBn(ː0&I$Ae$} Fs+(,-~@- z!8|z]̏}ƴ"ZMn+{VM)u[}B^%UVLfQSwӰ٨];6  #76jt0xrQ CM_-[mvBv9h{4my&Oފv~-*pX A R7 aX zPXdW~Wt]xsKsc2eM\_Wk/=Iy6j۽F]J*^i7A?lG/|Ln4RFEoK͠Vnkt_dm @ggD Oh+'0@Hh 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@,m4@7!4 ՜.+,0 PXd lt| ' Sheet1  Worksheets  !"#$%&()*+,-.Root Entry FWorkbook=SummaryInformation(DocumentSummaryInformation8'msoffcrypto-tool-4.10.1/tests/outputs/rc4cryptoapi_password_plain.ppt0000664000372000037200000012400013520721054027123 0ustar travistravis00000000000000ࡱ> Q   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNPRRoot EntrydO)є#OPowerPoint Document( 2SummaryInformation(DocumentSummaryInformation8l >1n[EVF67x؍K e?|.XYJ3fPܱTq-T]:]Һ f ?ݚpI6ϧr3}VǠgZw+`}㢢E((R7rEy|pOf-Yr_ N#ޕ_FT8&@* n4l6ZU Eu՘UxΥ3q|<}-d/pY}p#1ѷCHY_r6p6;T5'Q1πRgN\aVHu >DY!F;s䊳ACVWOiyC^W sP!(r ߗ9%^ W |6QElGGcS,?FE+<&gݥie긒9]h5,0M 6][?fʡ(~腍UфU>/7 >U8ty{05yuTl>hxdu7?rvT`B< !IkzON ޑ1ˋz "+R RhB.} /<^ITխ%rHK4uK~I0xM e`|X}đ I`߽N4aG2$RKIZ)4(M9`ctB{m:f@`3n|O,ܗr޾jxR0T ,0@}WBLǬ5vPK!7J drs/shapexml.xmlVn6?%Y#RXg?X5E $Y;$$PlP k(9fuqtdJR8 1bʺ9zWS!&\ 3_n,zxgL?4ݱ+3sT10T^1̈́!u|a6H+MV֢k: Ft֜Pf a Yi3@I "¹^Ew;js"]VIP$a2x<]Ɠ٣e3;̧C}ER%lH6MKh0;L(+*M`:-" opZ."|ģ|y ` z8 pt/~D#݅&/!s@<@$ ;8y_Hox'Sfi Fq:Batq6Nƿ!x;uήs^#!o.rTM8Q+'_!ݳ5hzAfwdo+YBm[F pKH`I ӰdG=H (lAbSbOt+{Qk מ>.P#+pK4㭽^!k%elݙ3[XH[E-?'@+Da%b6`2s6p?N ZK^M0'~5AС=6#`\XDҷ׫J?PK!5ddrs/downrev.xmlTMK@aDJѴ"jQ)qN>4;vi]y^j4ֲt .nVX܁YcgjyyLoiC-"} LJ_6dOlOwuC)M'od& 鱡;?E"v,a+u}5>x4!=̪W` z9Vor et ?PK-![Content_Types].xmlPK-!1_a ._rels/.relsPK-!7J )drs/shapexml.xmlPK-!5d^drs/downrev.xmlPKg  V*     ` ?*Footer Placeholder 4"PK![Content_Types].xmlJ0 ( / 0DCalibri"DArial DCalibri Light"@ .  @n?" dd@  @@`` tl  c $@(ʚ;DĔʚ;<4XڟXڟ֟G4UdUdX֟֟՟i)___PPT12 %0___PPT10 pp?  O  (PK!V[Content_Types].xml (|N0H+8 (8ĪVEBpֻ3iVwbl VLly Ё9!u{yL IuF^k2#z cẽN`0[mb` \!#s,Hё9}~TU 6Ul¼;{-dۡx/ ftΓCR}o v|i@T;\/E_PK! K& _rels/.rels ( 0nS=H^DtiUۛc a)hěBUrdk)Dd gIDr*dS("QlT3Q4b̜'օ9I]e3\0ťQ.D=vtr5aƓI+D#V0;f[e!/PK!tableStyles.xml I0@Ὁwh}-CQ$ +w*!@he/?JXd45ݤ{c@qqi` yߥ?" dZ@,v?" dZ@% @` n?" dd@   @@``@n?" dd@  @@``PR    @ ` ` p>>#cPK![Content_Types].xml|N0H+r@%r(0r&7yܪ}{&i*T8f;L6VT-{V~n^{)@ŀ< uw}l IvVNLTL3pG|ﴉ`(UoȮy=J2:88Z )9kR /Ju"(\fhnX soiɶGgϤqsJ8 `ֳ'*e$ ީ3/zPK!*8 _rels/.rels 0DnzЃXmlo0of5OIw AN{cݠv=m 838yG 6U} ShLq`L)d=Ҍ\@.;3, ;$e͂): vq}j:zɥ'k茜(f,ƁXA6\m>PK!82!drs/slideMasters/slideMaster1.xml_o0';D~XOՄFLbHVljlӕ=옒vTM"S~w1x(uO(* ,*+6A7Q,!10IОt1fVa% D0Rֱm4'%﫚0TqDgb`ȬY_m6EJ>V$L6B8X"/jqVFZ͉1zj{Dp*miG]`Hm6 Xwt?. g#Wi3E).+7 >ON ޑ1ˋz "+R RhB.} /<^ITխ%rHK4uK~I0xM e`|X}đ I`߽N4aG2$RKIZ)4(M9`ctB{m:f@`3n|O,ܗr޾jxR0T ,0@}WBLǬ5vPK!2rdrs/shapexml.xmlUmo8 ~A_/4;] E_d'ɹ(N{]?CH>Iݼ?ҍ9"jCޗ#m4~7Bw r7[{}%;&@WKKvi& 1aEӰ%p8n|(T90)ᄲ)" v2km R_wUoe٪L 4(VuP&*wdz KS5OmZ6uPq qQp)+UYI bijdV~P̓8 ]?ހKkIz^5;HƬn̹jhsOOP!S'Qo>dqUHme9N2E67qέ4l@Fb-;G&X1j\#]8 =œ Ym;Un{zĈ:qB-lB=1N1\9s mcD $VbnOKTeù5pq4٘F3"8zvC(^RƹdK C/N Kݓ@pYgd- uj)"6 )1Ȟ^PpabQcG7t@,.=(X=ѽ 'd'ݼb7hw=vru뷏4.8CvqF<`Eli0!g9瘉O&WDhv>N5bBnс)6ںC ;N ;o[ Bn-\دj}~Y R!W0mFAvv kߵ"f䅂ꡱwMiPK!e5drs/downrev.xmlTj@a[XlUJE,Sizf$mv61}^J/?3|UoёeqRms;2)rpT B)"} TJ_TdЏmKw' ])KF%Ƀ4Xsl犊l9g~MM'ͣRa4b_B_{>S-sPK-![Content_Types].xmlPK-!1_a ._rels/.relsPK-!2r)drs/shapexml.xmlPK-!e5drs/downrev.xmlPK    B     l ?6Slide Number Placeholder 5"PK![Content_Types].xmlJ0*miG]`Hm6 Xwt?. g#Wi3E).+7 >ON ޑ1ˋz "+R RhB.} /<^ITխ%rHK4uK~I0xM e`|X}đ I`߽N4aG2$RKIZ)4(M9`ctB{m:f@`3n|O,ܗr޾jxR0T ,0@}WBLǬ5vPK!C> drs/shapexml.xmlVn6}/ Z(iH\;I9Iy(6P k(9sfuptdJR8 1bʲw9r[c!$\ 3_۩n,z`L; 4=+2sT 10TwV1̈́!5|a6hH- ]U֢7ǭBu #AuMB[N(;H^=dNfM '{ uעuXA.`N'A'u<*q=Q6C}*/9DwY45UR\Q dUՔ <(XbE I0`1O&Ae4?zr<0{{,=Hz/~#݅'7= sn6K !vD0_@kWdzTdmq"(B3U2_hsSpGi%$Ffb=[G&ߝX1j\#湼p,z$ک9-dy { 6;?H$t'PPptp@m9'"(cjk3gޛ=.?~ʤX%>+[Ri PԜ  hN10h:S+:>W>v@"?Lqx=kQfz{dvK;f2ޛX{۞ LF~ v$.v-u tK{"  V]|>ydngp{r-vOfx \ U 2xu4GyLx Y:pj:{[F`-r5u#W켢C{ϒr, A{]Pȝ0g^^`gRRkw7xm/[,VIY9[7f|sasGyQOPʪɺmDOKg+2gtkDM#~WT ,ZE~j{rK+}ڟw|7PK!mV!drs/downrev.xmlTJ1Ff)mZR*HW8nkɒz/?3|`ɇֱ(A\9rsu"Dd1)8Sjv'P_Z$41vjb8[)ZjFgDZl954sCա8ZeCX2oU;2Mc9imy0 U+د߾ d//PK-![Content_Types].xmlPK-!1_a ._rels/.relsPK-!C> )drs/shapexml.xmlPK-!mV!kdrs/downrev.xmlPKt0  X*  p  c $ ?",&PK![Content_Types].xmlJ0*miG]`Hm6 Xwt?. g#Wi3E).+7 >ON ޑ1ˋz "+R RhB.} /<^ITխ%rHK4uK~I0xM e`|X}đ I`߽N4aG2$RKIZ)4(M9`ctB{m:f@`3n|O,ܗr޾jxR0T ,0@}WBLǬ5vPK!kKdrs/shapexml.xmlMn1 FHC}I Fa #'Jޞ#$vl{8SS` R j}Al& a,8m '6B8QáJykck2&Kz'ZICEoڋzƢK c1 j80dɇ>=PK!|drs/downrev.xmlLAK@a(X$ͦA츉fgCvz^1c|XNS# lz"mx@ńl L~(²4}Cf <\S=Gc./BdhJ 8v~(lvl Hɼ=. PK-![Content_Types].xmlPK-!1_a ._rels/.relsPK-!kK)drs/shapexml.xmlPK-!|drs/downrev.xmlPK DTjDr}1cOr80___PPT10." ɽ PK![Content_Types].xmlN0EH-J@%ǎǢ|ș$زULTB l,3;rØJB+$G]7O٭VÇ`hנ÷kaжkPBIvfYm Y0zw`nʷ(2 CIyr 4(%gx'$N (ckڸք'Qt!x7xbR7 o߼zbnʒ;FYl?/_|]0û}a[Sw?w_;9:3Sb=—S4AĔg@R8dbEv|!ոW/,“$qh|1:`ij.U'+ ,/VKȱĥ2JE ED1ΰwc IJ)q&Bz_o$SrfEV蘤 ۲sokC|a#ao ?2}(u?A2qčOǘ2o4BdsXfn?FrI]:Oc&rΣKvB~.!DI;DPv l 2Ii w>fVNt+yj>'b+O01}`0`K[*X=z%"sIqb+e]9RwC&b|N>fV d?ov6Ϸ̡㶟ϸg#l[nԱG~ܣ҃g? BD)>G>Y2GU` se EG߸jP+?=D@NE+?xW;cz16{[Ow׃SC HfЖ Hpj*4֥=e =֖F>75feo5CZc1ܿ$7M2˒ 9D" N R"1(I{Z~>Yr]H+9pdX4n(K篐\V$ =I]B,lוD B=XȶSkI]&(f2:t[iX30IQbU`MZմ9UBrFL+b 2c˛yĐ ݔ亝>`~{`PNfQSӰŨ];6  #6jwVt0xrQ CM_-mvBw9h{ mPK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!y|:!drs/slideLayouts/slideLayout1.xmlV]o0}G?Xy4"4iIx7D8qdNQxɇ}97~whS!͝waoJ7uT0;G*woLN!dNTy$5m=`nE;` }?Ztΐ/.mChɮ 2~Y7KzA%%cbԦQA&^a&p@Y u/̐GЃ2aJuB u'L@M&0AKՙho\*xZNyA&t#XN4sGYdUn On籛[Q 2G$$'b \"kFkxfG-bI7 tVΦQ&M`f :Y20s7:Jj:ҥUI}ٔ6h{C 5xhIt3% <7AVAF1!XB::jOܡXjaTkud 3\ aAhޯmZ,YC!nTT kh1 < 3a*ӄwѩ&欂BGC?,V~1q?Ynǹ[ŪL~9/ ߿pbB7(2" 1u/cwe\הp*0ԍ03`wB_l_<=ۯ%!drs/slideLayouts/slideLayout1.xmlUQo0~`BT! ӤvtqUd u˴0}ߝ/.@;4XCeɛ)[#mHS!6㇋6Ӣ"50)i3״b5ge HU/ص Hp>IYc:1xV1 0eHBPcvFxӕ(QCjXs#o`)hƙvjWr_w Ң(f3XH$oT= T;'8 @ۤϻyŖVWP2:N'bkfh,0?_Wʋ_2LA-d2~E@JA-}=]] J Z^;t%:epz#z i3eyoI2sL$pxneIff 2tMa &ڥ (@e8&>V*)J8.6(&tNEܛq(qyI`H*Ө;t(s@aIJiX/ /$vi\_?v8WD*]1*a cİ쭸WF,V .t*DB]f7/mpb wPK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!>!drs/slideLayouts/slideLayout1.xmlPKUK PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!@N!drs/slideLayouts/slideLayout1.xmlXmo6>`AAbI6mm֨@T#XNRPcŝmYޖv~ɽuZEĖZ{Zկn&-^zLݝRd0hU}U7L\Qˊ(x$vp*R ׮lQ}ń2 q@vW6m\H^}oMIo>d_9sҠZmn$c(-fݬ^NE( ӯ`0xC"c!dqSwOXD&j>W Y[~Czmỏ>NT9h(u:-ŝkkKѡl:!)pP6KԄ<ف#V" /:aBaQ,)2 ' HAg"LzI34D  M @D`-Ӊ9@%%b3 `b"`WeU د_VO~ HOtZ\IlM2&нXꕘ /uCZKƢ^ɺ.p*)(?j'ŀ}pt_X-º`0vYoe<`Lmq|9<Ϛ .#8\,fqwh†0 I4]΂ gf-x*M;,D2Vxuzv؃<0pw,OЌc)ڡ$G /Cu~fyb5+X.a5%6V<0S9 L+9@&xUVgXni5+鞳{]xB2a;!ƚ`,7g.:EhӨe`K'LrCT itϓE+ӨB  ƀ/"Z3略ʡH[܋ዼ0X>F'Fx4A!Rn|9nU R=`?9K4l X˭.C]b `;Tjl~7oYSQx0 O *42z&+ S]d_T\Y?`RXTS_[9*O3_1PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!aBp!drs/slideLayouts/slideLayout1.xmlPK`PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!)zOr!drs/slideLayouts/slideLayout1.xmlTn0 }88EÀt)4Yʒ )Y^JmC_,"s(o.-GgM#E#&q, 12p)X;f뗹 6'CVahhZb&R1g[baaonyOYؒF!_&_ ewZ&l'7ü>43-v l+xgpFx -8. 0wb^3,qN=hQS9!K?H$t@dB";雗bi :/ \;zN$$tuБ%'KR5k =Q,e9~$lǙW 9`wv }BV"V5cF~EkoP@eL'_y {g=t@^y=0PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!)zOr!drs/slideLayouts/slideLayout1.xmlPKP3PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!@qD|!drs/slideLayouts/slideLayout1.xmlX]o8}_i 66QQZ36iIkMd"Q/_~z3mTu*/ ]KHiq?ѿ.BZ"(Mjկ\:V 0z'ihTG$(-EQ\γ1 kлՐbL$:O7J˺G+UR}R-a̓X<.ݟWx+4b9E^*EJ٦VRln+-%@Quf걀fp3zGe_]1dC{@V^'/husmh=vF!ti%LnU:ѿ!,(;D "oF]ә;i#{ckU8ӨX6G8z80&=t,jGR:BвiX.3, \[A>KL٩\idvGEt߾Vbx1]ہÄ e$$Yf7V,0H ]GO[*qV7f%JC4Cpf\@_͕7ZMRib(2=\XdR~,)IRRϷb2.xv:EĝMy,1g2o.ɨ5 @/W [ƭv%4fێ݊!PiVJ]+^nlaPZ*[n8Y ':Rw4P:@̆28FPCu1U A1P6Vxjy=X8*J@S0Z{653v VbuVbDn%VZ)$*kBU`9,],*OWdWd_ ,σl21([!;EA8QPy=CgR7Cf,ʲRxJr[.S˛bߜ̰m%ٴ%NVy1O"QZl섎#,G\j8rRCi [a<27x;]>9h S !ħ~˅zMEךWquZ뗬c DiҞV×[ ߨ?TԱV`#)okvkyy'@Y%p@G5ʈeOҢMMJ1.I'حzwovG 5lٱdG%Wr JuxCL^FX2oy#""t:쬟D zR'ϳMwLlUD{vӢ4v;^14?[lE_9:UF.7T8w0ʪ00J> )A&[AC.A]5|fcX1K/mPfnn^FyTe8?h`]ok'y'A@Z:i'74Bx fP oϚk&Iک3FiЃ#]itRuRѶW5 FR b,=# 8kaU? 4cLd NݬJ37q:J1aSoxAsEgQ $gmA$:@? 2c8dmi٧C]3ϸXvц-bHLKu^\}Bu/@/Xz7I{w#U%o&LCh`eUl?q~y&Aj_{לEi.L&ќdpOzi&R/!^PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!D;Z !drs/slideLayouts/slideLayout1.xmlPK0!PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!  !drs/slideLayouts/slideLayout1.xmlWێ6}/ 7Ď$z\^ . RK@})r.gfC#ȞKUwo͝9DiVTt-;GW_ %;z5*ib;Pum'S>*IۍZΠ/wm=7ֈjvuFkk /!c*~r{6"-m`b:'(ȥYUo(KRWhdPvf f>[+-[,ni E;/(т4avgwdnB{ѷc8` ;GDϲ;2X2rK:2u L>LrS?_~MMNu[}úff1r G0J/kw]&W]gA`|$B 㿉R|Cl(ci;( D,a1Q)9)( Y J~:ae}-N<Ya:b^ЇeW4-uQF0b/Rŷ{'C7IZ@JbCac}J#U[4d:x2"Aan;--qO II .}a V2]W`k,4pބ2 ER8ЧOD,GDcD5 dHCu[AC!VZF낼AeՉ*k!Z|%$S1w1]Τu$9P0z2 aIh@))p"F3܏0g"nt뇩ozkAx Ya֦#^9Mx 3Ë 4 'oAx3^;}]r_Me7i;7DMtm6aM/梢&T̅ž `s-{x3N4\&"hc|u-PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!  !drs/slideLayouts/slideLayout1.xmlPKB PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!Uy=!drs/slideLayouts/slideLayout1.xmlUN0}ҤiJ#ZDf Ƕlk];1hNڤ$sgU|'QNDip.iytg?\ :Ӡ6FQIM[OmjOuU E`E-nxcfdRn:E6P=<M*eX9HV} R;MVB0n As -׊Rw\nj*Qs`~pߨvvs hvOH9DI2K7bI|#: @ϋܲu;oòWU4x,ˤ-4,a" e: dxL<fO6;rsg$msBDuoio0KcVE2,I"$['h4]HomCB"q|z(!JM߉sy!SMuO^`t*sgy*wD϶l[U^s.]_[i WzPmxmBx_Odk3y, rT-,<Y7u%#5&{;_-U\ * KWqVJaZk5IߴK٫~oʾ.&y.h8 oW>˙Kh 6N7\Ԅ.ӈo{M)R`ߡI 6+ŲL}uldɻrXfZ1ϚCC!$›Go%c>F%3(SqEg{"Zw\i!6Ka 5!) EL"]7LNt wn Pi4uSX0N&i^g~^iEI̞W3.6Lĺ`kn-fƳ5na#}ҷ0J吗SM˨73 IҰP肝Cx#;>K`y#;`'a# Gvzf#8gɫ&4Li3\gy6>L?7K|) ls'PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-! !drs/slideLayouts/slideLayout1.xmlPK Office Theme [S ;(     j0e0eTitle 1@  = Lorem ipsum  <   p0e0eSubtitle 2@   <  DTjDr}1cOr80___PPT10." :"r0  # Oh+'0P px  $ 0 <H' Lorem ipsumMicrosoft Office UserMicrosoft Office User2 Microsoft Macintosh PowerPoint@I,@ :"@Ѓ# ՜.+,D՜.+,   ( 0 ' Widescreen2 CalibriArialCalibri Light Office Theme Lorem ipsum  Fonts UsedTheme Slide TitlesP :B_PID_LINKBASE'ACurrent User_1_ Microsoft Office UserMicrosoft Office Usermsoffcrypto-tool-4.10.1/tests/outputs/example.docx0000664000372000037200000002733313520721054023173 0ustar travistravis00000000000000PK!ߤlZ [Content_Types].xml (n0EUb袪*>-R{VǼQU l"%33Vƃښl w%=^i7+-d&0A6l4L60#ÒS OX*V$z33%p)O^ 5}nH"dsXgL`|ԟ|Prۃs?PWtt4Q+"wa|T\y,NU%-D/ܚXݞ(K/4Vm^urw2NP0ŮVw5j o7o:>S!?p8JX[d0KDEVKc2P,ũa].ﰘsYҡ+(!O>zPK!Hyx word/document.xml]o0'? [C>HT]T6)Z1&X6"t ~s86ݿ9Rs׿\ "#&vsu"©tv?00 Ę,DHro9#Jj["9qETxWeJ5k‘nH8B$З_ ;4m=@oWdjF@U4Gz%i&MmҴUN]2c86`X 3l̜ؖ53>&LMQMsDXozzXꫦV.eu8#ESȅ:ay4Lj TxGPCS|M.રɶpՈ][y5r%!5vd FBmTլ0X9}P <}i]h1C5C"lnM9Z׊ZW:g*R/kc_6N`jEtYB85%f v" Ɠin Ft;p&`:*bpQ1E]bs+S_&GxSkR sw0Y-Gdj3Lh9UL53uJleʼ PK!g word/theme/theme1.xmlYKGza5Hk6޵Rkiڵ0`r C B 1cII3-ď] U?4s:G ’[=Wqؘ$aǽ}0,\GHe ,܋;v8:n$|,F096 M.cAoL˵JQI\'A11vJwg|@_"QTcCBcӪ P!qa1;>P$$Lt܊s;k!* dsrC[ 5-õ^֯TnAcX4NS.f-(mZtz׷]_} Mo ? so^7kPllᛕnkx (I[ߨݮ!F/[m6kKx*+OdQCh"IG.fxF %8$ f(a+ʰR(:QN:!#Nf^nŋ|Ǐ_>uey7?}/͓oxǿ_Ag?{rt :>vn6hY8KtP) z #}}(zش4gޏ\ Z=hq랮V'}q>n!td[;`>'6A 7)8QslE.!]Ȉ3&ҹK"VC#2$,l߆m8=FmD@ԦSÌ\4E2_ap!!6|aнi=M$djC">gV$+b !LZI0>%Cېfv$03N)H]NћFhbL1cܾbóaelUdƪ'X@c0Bvb#,P#^ \u5^hjRա!bcZoF+x]pr@ζ9@X U-݂LD'-6MCQ$ykQ O-өwT:Ed)mV5c5}4OnbG,г欦4E9d*GdE?Z=Z§>B\P+t#쏇0;ZhiAs 9m3~fLUP83&pVj=6NGsM@2k5eLGZA늀}Lu j-$NE¢_K HRFncT~St1m,k+iD.L0>e_3)i4[*l=\5#4xTIɥ?$̸}$DbPC@[T{Dɵ+Wx2#Y0ua.Ub=!XuHGc-Ue1rm1άGxߒQDgZ(du{M'tsWfP9ķۅD.i\ ִ珏wXey`\^庢[BZAM1PFMjX[fqڷfԪ bUW֋mvx"J¯+4Uv/9'AzAJ?(yuRjzVC0⪟=t|oǷǫR܈ewt# k ZF5J^ڥWuf5WռvPK!H1  word/settings.xmlVn8}_`:ہP$Ab)idsË0_!%MP8[%̜ϐ=ZMU7jtv}ݬQXr&it}؀fZDL,i;@2sKP%ێdTL˒YrvQCQ*n(ڒg. uQ !/[,uVIPg A+ l $mb/E;l1<P: )B\_=羢=~u^mo7<16Q1G x k6}Y|UY*oZչZ!.3RMdu ibNIIgY|%x+.KV4%6CE&iPJ KKr3߭lǐe0)YFl ,jr ^$m5~ݪ2gHR_Ġk:Wi3t輄&!6H{$}e,'F_gr?6VlEm{ddVkN夯wKƋpޚQ|owK i\[Q$;r717aEk,dz\B/AFIw| &kb5M_CV~o5ljn*{1[X0"g{:#ŧ9WO.8G* `]F2!V8\Bbp{muUYY8&+e*MB{ TyObK_'` g־l)0qj5+Z7lυYH{_cen,N~ mp mxmtml;ވ'tB ߞzdDezzjLpC[a5q;/}i0 fw~b 䵺̛PK!koword/fontTable.xmlܔn0}{,J9(f(ҡ#MSQHڊWg}.1(IɎShJuw/.oY-TT5<±R>ǛYxJ#>E$Ke gse8YNC&23!m~gH~ggX i:)K?J|E1J9#\$! ---rIR,-x QX %b]3)3r(=nG@ <0VcJovqin1j-q!$5$#gn9a63QC҉Α!. oakoq"R#F֪rTȨ־@ 3㘫 BcPX4ڃڳ8/-Z v8s_(pħrJ1o<u*"y'Dk)!\o? Bk"15i9rf~I?`|Lӣr391GI|\{z岔FDe!E KwZ9jr PK!OZ<_docProps/app.xml (SMo0#"߻٬PV+ tM۳q&c[4'N|ü,C2™_O a?Ti?o]zo f~8TiU, {rL^C{;^Wzo~.-}]/PK!abdocProps/core.xml (Rn0W?D'vV(JVTTzs\lC$So;;ݱAVZ(M@1ͅZm9(r*N+@ 84+oorf2-Xmz. Neh0vl$(T WJkl(5!Xzɒlp ;&)h=X/1pUz&{^XuR[i?XcV Psy+(s|)Cv_|Ar 2Ya|xnn:o/,ia~xbȺi9G判ӘxI&dy\i01x6n~PK!? qword/styles.xmlrSw`*gϸֳe{xֻ3 IXBR> v|3c͓~53 ާAijX%" w>dY¤_/EYqgYYO"ԜgÉSVti1߉U:g )ʷ](j21Eʳs.5QeL̋% E"1kPG:0GKLAƧLl,5IM.`iND-dY}^_UV)+b!tg41~sb?( 3ȸ(/D"Ch_3g;IMlqvl'ykgM޶gWշ ]ɣPS>'J`4|υʵi_ox*nDb6 9c_į߈"Yd\|nl?͘&@o/ĺq%lgf.#lQ}Q8[\v-TCG5tQ TC'jb ,ᯕa3q#1 qIt4Ǔh'MRž,t0]Bw }nøۧ0;}sVtm]6QTɣLlE3;=l$qoZbM?/M I4E3BXh!0"HHN|sŜ2Rd< 7lJYB<|K"ɤJh(g$ S#XHt~Фe ,i`1+_8Q QM#F4`5hܪF4n5hjZq{S~R*sHw?Fb1迻F,gӜg9܌u΅Jޢ}ڊD)rZdA2׊Gd`+^eY3Ÿl4%u2E6VϰE^٠K?rI1{ٿckV[HW# z)UD3 ߼y˲ޤk%z qT5VNJ3V[+m 'ӣ;6AF ѭ nGjnL304 U*%cGNs]goD[{Ntx.N""$P+'4Wׯ8bZtxKϋ/z!X Y޿Y.q!*S=Æb'Ou?TDrdEi?ڥ_&l/z``c7p7vGB QmG' I7K .dC" -< <%L#8$gyEB&Q)aaT2XF*@+tXtXku*Q,3 3 3 ʳoL"n rAhsy% hTV]M4Ǩ%bQɺfX"8"ʤTzc#7]f݅{b>S2g^Y\:.2VG]e1?o Xˎ›)ی^^IlDumo\7"O:F6?w>݈l7?5&I[jĨbTHA"FQ!mT@"PFAFQ!mT@՞,aT3*1*RFQ!mT@"FQAxQ!mT@">E~{~SWupovQQ^YEP)j b,=]$u;|\zχ.Bs~5S9lKy7ymFUaFaۤk}(E@p4yfk'qn@8mx}Qq:^]_ mNZ-ch ]'bQh0ͰROJ ARL,5DI 'FԐ:|rp!*Xj ʰRCVjHJsńK QRCTpqRCVjH`¥`!*LjP%Ԑp!*XjjEِ[9jɉB`Zj\ ]ePzz1xa(~TԸjIp XqՒWj\*5ZjW-UKMR㪥&'g?!Hj\*5ZjW-UKMR㪥&qR=w^LԸjUj\W-5IUKMR%ԸjUj\*5ZKUKMR㪥&qՒWj\*5ZjW-AQ2{^ +f%p,煒<Л:|*ӆ98RoylsQR=/&ߖ2GQ{[۶9֪Eg~;cc7y:k߮v=^6FߥҖ>,n*}R;w[uƲE6mhK_UOWV\;V}[_|RV |\=2۹ nvzYg')i&Wuߖ_PK-!ߤlZ [Content_Types].xmlPK-!N _rels/.relsPK-!dQ1word/_rels/document.xml.relsPK-!Hyx word/document.xmlPK-!g  word/theme/theme1.xmlPK-!H1   word/settings.xmlPK-!koword/fontTable.xmlPK-!ԍ'word/webSettings.xmlPK-!OZ<_docProps/app.xmlPK-!abdocProps/core.xmlPK-!? q word/styles.xmlPK ,msoffcrypto-tool-4.10.1/tests/outputs/rc4cryptoapi_password_plain.doc0000664000372000037200000005500013520721054027070 0ustar travistravis00000000000000ࡱ> (*'   bjbj 4__ <<GGGGG[[[[ g [Vssssssss$n$*GsssssGGsss GsGss{4}&0VNNNG$ssssssssssVssssNsssssssss : lorem ipsum   hh hw hw  21h:pxe|. A!"#$% \ߥ8Y4G.:gp\]`7}-YwƧi3=Sua$&`m a>g<}isRg mxH {C<>Yf'd$.QR"à ?+a}+Ę,;eڑrR\xX:`5\* ,WNEj:jR5zkͳhEun;0S:q @IOk!;p B79xx Q;8rqӭDH6 q%+Bu @gXHm^-vZ}B 1ZlM,] .~Fj[;w666666666vvvvvvvvv666666>6666666666666666666666666666666666666666666666666hH66666666666666666666666666666666666666666666666666666666666666666p62&6FVfv2(&6FVfv&6FVfv&6FVfv&6FVfv&6FVfv&6FVfv8XV~ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@6666 OJPJQJ_HmH nHsH tHD`D NormalCJ_HaJmH nHsH tHDA D Default Paragraph FontRiR 0 Table Normal4 l4a (k ( 0No List PK![Content_Types].xmlN0EH-J@%ǎǢ|ș$زULTB l,3;rØJB+$G]7O٭VGRU1a$N% ʣꂣKЛjVkUDRKQj/dR*SxMPsʧJ5$4vq^WCʽ D{>̳`3REB=꽻Ut Qy@֐\.X7<:+& 0h @>nƭBVqu ѡ{5kP?O&Cנ Aw0kPo۵(h[5($=CVs]mY2zw`nKDC]j%KXK 'P@$I=Y%C%gx'$!V(ekڤք'Qt!x7xbJ7 o߼W_y|nʒ;Fido/_1z/L?>o_;9:33`=—S,FĔ觑@)R8elmEv|!ո/,Ә%qh|'1:`ij.̳u'k CZ^WcK0'E8S߱sˮdΙ`K}A"NșM1I/AeހQתGF@A~eh-QR9C 5 ~d"9 0exp<^!͸~J7䒜t L䈝c\)Ic8E&]Sf~@Aw?'r3Ȱ&2@7k}̬naWJ}N1XGVh`L%Z`=`VKb*X=z%"sI<&n| .qc:?7/N<Z*`]u-]e|aѸ¾|mH{m3CԚ .ÕnAr)[;-ݑ$$`:Ʊ>NVl%kv:Ns _OuCX=mO4m's߸d|0n;pt2e}:zOrgI( 'B='8\L`"Ǚ 4F+8JI$rՑVLvVxNN";fVYx-,JfV<+k>hP!aLfh:HHX WQXt,:JU{,Z BpB)sֻڙӇiE4(=U\.O. +x"aMB[F7x"ytѫиK-zz>F>75eo5C9Z%c7ܼ%6M2ˊ 9B" N "1(IzZ~>Yr]H+9pd\4n(Kg\V$=]B,lוDA=eX)Ly5ot e㈮bW3gp : j$/g*QjZTa!e9#i5*j5ö fE`514g{7vnO(^ ,j~V9;kvv"adV݊oTAn7jah+y^@ARhW.GMuO "/e5[s󿬅`Z'WfPt~f}kA'0z|>ܙ|Uw{@՘tAm'`4T֠2j ۣhvWwA9 ZNU+Awvhv36V`^PK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-![Content_Types].xmlPK-!֧6 0_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!g theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK]     hw xe @   @UnknownG*Ax Times New Roman5^Symbol3. *Cx Arial7.*{$ CalibriC *Yu Mincho8nfg_., *Yu Gothic Light8n0000 LightC.,*{$ Calibri LightA$BCambria Math"h|hg|hg  r0 @P $P'w 6!xx  Oh+'0d   , 8DLT\' Normal.dotm1Microsoft Office Word@@:m<{4@{4  ՜.+,0 `hpx  '   Title  !"#$%&)Root Entry F0{4+1TableNWordDocumentSummaryInformation(DocumentSummaryInformation8CompObjr  F Microsoft Word 97-2003 Document MSWordDocWord.Document.89qmsoffcrypto-tool-4.10.1/tests/outputs/example.xlsx0000664000372000037200000002026113520721054023225 0ustar travistravis00000000000000PK!bh^[Content_Types].xml (N0EHC-Jܲ@5*Q>ēƪc[iiBj7{2hnmƻR U^7/%rZY@1__fqR4DAJh>Vƹ Z9NV8ʩji){^-I"{v^P!XS)bRrKs(3`c07M4ZƐk+|\|z(P6h_-[@!Pk2n}?L %ddN"m,ǞDO97*~ɸ8Oc|nEB!$};{[2PK!U0#L _rels/.rels (MO0 HݐBKwAH!T~I$ݿ'TG~xl/_rels/workbook.xml.rels (RMK0 0wvt/"Uɴ)&!3~*]XK/oyv5+zl;obG s>,8(%"D҆4j0u2jsMY˴S쭂 )fCy I< y!+EfMyk K5=|t G)s墙UtB),fPK!1:xl/workbook.xmlۊ0 }{g'6q8(eikEcK2e߽coRz%f$}g*tfp%sO<3X"K(r|c?,>_>:!H6s]Ck&IةBi5#qK\AwB?PU)[+ &YC,75oH#8AkD o PvG494PՏU#wxVFUv8.];x1xÞsDmn0j[Vx 7 ݵE=OxFL?j~&G0*YEaバO4'8?>Dg.Kuq8(J [ϼu0~-Cu .Sg='M\SiF%hV$e ]tֿw?k4Z/$H?Ê:Ay˩F c'3YE`O7MO7-lʚhׄ+gUA ^ƌ7PK!Bxl/sharedStrings.xmlLA 0Ew]H.Ohɤf7">),lҐ@7 ii1Zx!C+,&5&Mr%yXn~ QR]t@ y!ЁZ(<Έ`2ZaOŽPK!N xl/theme/theme1.xmlY͋7? sw5%l$dQV32%9R(Bo=@ $'#$lJZv G~ztҽzG ’_P=ؘ$Ӗk8(4|OHe n ,K۟~rmDlI9*f8&H#ޘ+R#^bP{}2!# J{O1B (W%òBR!a1;{(~h%/V&DYCn2L`|Xsj Z{_\Zҧh4:na PաWU_]נT E A)>\Çfgנ_[K^PkPDIr.jwd A)Q RSLX"7Z2>R$I O(9%o&`T) JU>#02]`XRxbL+7 /={=_*Kn%SSՏ__7'Ŀ˗:/}}O!c&a?0BĒ@v^[ uXsXa3W"`J+U`ek)r+emgoqx(ߤDJ]8TzM5)0IYgz|]p+~o`_=|j QkekZAj|&O3!ŻBw}ь0Q'j"5,ܔ#-q&?'2ڏ ZCeLTx3&cu+ЭNxNg x)\CJZ=ޭ~TwY(aLfQuQ_B^g^ٙXtXPꗡZFq 0mxEAAfc ΙFz3Pb/3 tSٺqyjuiE-#t00,;͖Yƺ2Obr3kE"'&&S;nj*#4kx#[SvInwaD:\N1{-_- 4m+W>Z@+qt;x2#iQNSp$½:7XX/+r1w`h׼9#:Pvd5O+Oٚ.<O7sig*t; CԲ*nN-rk.yJ}0-2MYNÊQ۴3, O6muF8='?ȝZu@,Jܼfw FWd@y֦r(eSj s0NyZqъ _ @:%?Fj' n U= xzl _;Lhӈa:nT'80f%z;.W/$U{*g^ }UXMw/3|?$3ԮI]>kݭه/up9 &, r$jU89Ne & +`!فIѡ;s2 8`2`6=O"tNd=y IГOK&:С?$A PK!.7q+xl/worksheets/sheet1.xmlK0,߉X%Y{Ty6΄Xqd~CaZ Plf~Wǣj+h@'t%MA}]fXǻ6 m3Ƭh@q:FqGa7I,)S\vL= ]RRΝ!ZPmdo/4%)n~$tJ˦ӆ[%\O%pIIaյ ΚoOYʸn %^I&WV 6|LUA&4gtitIXqy%>+b.<ʞ"|g `?kBn|Wx~2d-,tCVAA5ߵ>|iN1 ?YuZ8bE=KÏen/zbrQ J<^} 1@%V69& X(DBgp&y/c8 ѾuH^卄AJgC19z_:ځ_vZݥ5įO戱X(b[<,x%2Ŝ[oQ/jk5ЍJ#a}2jӪK1~E `Mv&)c+J`*\;\ Kĝ#٘L ^ΉGw|9d:vɄ#77^9!8󲨶P}.Gdɺ5aIwc8fQ~*O5%߯ZPK-!bh^[Content_Types].xmlPK-!U0#L _rels/.relsPK-!>xl/_rels/workbook.xml.relsPK-!1:xl/workbook.xmlPK-!B5 xl/sharedStrings.xmlPK-!N  xl/theme/theme1.xmlPK-!  xl/styles.xmlPK-!.7q+xl/worksheets/sheet1.xmlPK-!Ё5;QdocProps/core.xmlPK-!oTdocProps/app.xmlPK msoffcrypto-tool-4.10.1/tests/outputs/ecma376standard_password_plain.docx0000664000372000037200000000754313520721054027534 0ustar travistravis00000000000000PKeL#= _rels/.relsMKA Cl+"Bo"3iA PǼymNAêiAq0Ѻ0jx=/`/W>J\*ބaIL41q!fOR.?|m ?@IwPKeLUword/fontTable.xmlPAN0 wz[gXב$N+!ȡٙY?=6*9R i_:T}r(G'YWwˡl]jQʁ!y 1pHq h! 59JBCěw@['NE!Ug2 D^={'HfLGvkqkD<OWǐ[ ɮ`&}d[=O{>Ο:?xPKeLvՎword/settings.xmlEK0 D"XHBkRbG +73zybr [0vASH]57Jd+r!QNS+6d&c鑴8GSs\,_WZg8J槽y@h֖99)wLܨTJ^:)P5DEm;/B JdXx4Tnvz- S6)[StXo4!!qdvEgtxdN==g-2mL%yg0T\tF㘘7 2[|,Ei 3rlp 6Xp0s`O ʂ2AaKqFm#7ҸpwίB\;fx4gGwŔ.x#%,pbcԣBхvcj:h:yyF^1=~ۧ[wJ^^y78;TZ{Fjk]_ kf t-RЫW[wXMƵ'PKeLyword/document.xmlTMo0 W'עȌ:vX Pd&E~k!X/GGҤ^N[|DZM~6,m5XYi/*`}%^p2J xi%PJѰ1K"MǠ58iVNM:Fs=(5o_g'rBzak3MPp#-߉pa(4!{Wgo-wrak> sTk8\ _˵%cY1X@~aQc۰ '.ѺcWsI_.sZ4"Ŏ j@i0蝉4C\R{q/]s0y%6/L?8[-kNwUӾ:W2,mnAjY;sRMPskphڏEP(i0V5ONFHPKeLw9docProps/app.xmlN0) ~u-kTXBO_'PKeL[Content_Types].xmlAO0WE`Mm?ڦ_ۿ+nĨM/$>OiC }ښg9KHiKPߦWlY-z5X.w9u`h~^}˝Ϣ~\Z4VZA>܉J=ȳd{ 2K&ڨOtGq;jᔕ/27tCZ<?ڦ&X缕HE[g%B a<=;xV!\yh PRJŁ7_ՏEEPK$.G)^PKeL#= _rels/.relsPKeL/0word/_rels/document.xml.relsPKeLUword/fontTable.xmlPKeLvՎNword/settings.xmlPKeLmd"word/styles.xmlPKeLyword/document.xmlPKeLw9docProps/app.xmlPKeLoEgQ' docProps/core.xmlPKeL$.G)^ [Content_Types].xmlPK < msoffcrypto-tool-4.10.1/tests/test_cli.sh0000775000372000037200000000203113520721054021267 0ustar travistravis00000000000000#!/usr/bin/env bash set -ev cd tests msoffcrypto-tool -p Password1234_ inputs/example_password.docx /tmp/example.docx diff /tmp/example.docx outputs/example.docx msoffcrypto-tool -p Password1234_ inputs/example_password.xlsx /tmp/example.xlsx diff /tmp/example.xlsx outputs/example.xlsx msoffcrypto-tool -p Password1234_ inputs/ecma376standard_password.docx /tmp/ecma376standard_password_plain.docx diff /tmp/ecma376standard_password_plain.docx outputs/ecma376standard_password_plain.docx msoffcrypto-tool -p Password1234_ inputs/rc4cryptoapi_password.doc /tmp/rc4cryptoapi_password_plain.doc diff /tmp/rc4cryptoapi_password_plain.doc outputs/rc4cryptoapi_password_plain.doc msoffcrypto-tool -p Password1234_ inputs/rc4cryptoapi_password.xls /tmp/rc4cryptoapi_password_plain.xls diff /tmp/rc4cryptoapi_password_plain.xls outputs/rc4cryptoapi_password_plain.xls msoffcrypto-tool -p Password1234_ inputs/rc4cryptoapi_password.ppt /tmp/rc4cryptoapi_password_plain.ppt diff /tmp/rc4cryptoapi_password_plain.ppt outputs/rc4cryptoapi_password_plain.ppt msoffcrypto-tool-4.10.1/tests/inputs/0000775000372000037200000000000013520721121020443 5ustar travistravis00000000000000msoffcrypto-tool-4.10.1/tests/inputs/rc4cryptoapi_password.xls0000664000372000037200000006200013520721054025543 0ustar travistravis00000000000000ࡱ> 0/ '/ ~ hMicrosoft Enhanced Cryptographic Provider v1.0k'%G|dHVV .|U@D}+kCf6(5b\p ^_e2:TYgYC!K?0lݭLs1ys+4}!cH{?9ȖHJ S .~E*W 0m"X_Ba}=Rɺ0E\u=o rn(!@x3"F%7t1^z}+=۞[11 [gh'"4oEtA1Hؒ?Cb?\\|<8 1 ֟gКyr_R16KQͬRݾUPy=1}@UGEx 6TXxS1FF2:Ƙ1$!&!*kP$F)*b콫1&ҹ1 $0Pm5$tNabsAِ#o _Cg{Ygɧw^GD|\}Jr6CIQ*]s`F%ا@utey-R&3jX^S/<̂6Fc3?qag:wKi9 o%sY ~2f}=7[K]5GnX&Լt"/fc2pP U!jWդqXfn Ò {1gFgS9AjGGn'V Xlox]k9hC$j5 FQ.,s{Ql ahB1뭗=JPj|B A ò?tEIʠ䡕J),^N.3U L GN03.GtU8V͊~< +|"`^}yf }$ 0jQDv)2Gyz]y_]hL4TH#C_#]bp.`;͹][%WvlĕMLyx52߾j{F-4{&hAkF=j52rbVIC |%GSW \ #4yBDϠ&tp<|ޒXʉ7Lsݔe2|}쬼1EREcO@VDb1B&Q uN .ٗr] .&$TY3a)|(Dtj|0 '*2<bNe[}-Lo*T2wrx:q ]A LO}-x]'o$ Wq(]hUBb '?}-mA8⠮rsܞ!Fv "%ML$Ef+x}-<cfr \k~ (; d՚*m(޶!kX{>}-$w!t`m7GEӵMk[ ,}-}9T̃ٔX6 H;u8& QR& J}-y c|=^zmY#C۷s Gr}-fMVn]^?^RCQāQ ${z6;LI-c}-r|QP~ @6[7_x,6\O\3|֛2 }-:Ұ0)$g2R} t}gaUndZU3p}-NRo*Ui+%@b7p3@3MPR'io}-|r,9U'uZLLg(kw nv#}-؛ %Xȵ%I|R%xTUgٛ%5}-{v|Zvxk:Uω+ ZG>9Ō|CF|jU# Qc!a}BӗŴbz Q}A"[FDg5΀砅HsW<ڥr=KIQF0[Upwܱ@ txh ]}-h7!S=ө0 ՕLA"l e;}O4&j}Aq;v|REqRҖɥG#,o fӨZÙds̝}Af/kzϏҷ, >`25SZ~buثx,E:|%n~o}A@^| 3ȓԐ'8takO ($s 1m%qRoX1 #@}4Qͪ8?mҕ3k͢3Pz aTJa+\beC$\<֗38畮}}//9j% NpB |"ah1cˤ Y`k(Y 6dsT}6.۔;.Rs[ VQD![:x^z"LRHUU_RCXƗ+ƻ%F='o=L+W`rCb%&Ic G]UP[!o֝Q߼}hQ!|KUSC = 2D!2 NQ<.k% @#1ɄfoHw5dW2`fkF$))ٟa NL8ą OqFxNPK ѻf~8@Â'"JY}A A\ `LXr.&RS+x_!5J?5w eK}٩g0| Kd/&}b쿀a~#6*ldU(LX s=$ G qc3sYy}.iU۩BeFPF=oP+|qV@ G- |}-ZOҌw{`^bRFZ+dVOVD3\Qy}5TbGQ,!ĂB 2&K/m_t{"<]}|ޠ/pʟYszpNkccqt?.AŋXl>Ml E?~=2*V]7ҕ^nV/2׆I9J[}A@ĝXEqT=!;BxWёQyg` $O?$yp Zׂbŷp}Au?\2>ؖyӻzW85l'FhaM ޺WWs4Xg6s}AH5BӍW>;q}V b s6.Ek.O9ZvWC~h4]}AZ{[JU#d}gղ5ǬN+bV/q/$:P"0%9EpP SE!$}A =NSXg [l>5>1TKiK}tAWe/St5ʰU{q}AU6`Gt[ a jqXIUQy5Z j`d}A0]KV,\@??<*D.eSp_{O"}A˂VȣQZ;{Dyā›R[}eD 1J2FW$*SR$}A.IKyqܽ=viֹ$5h'342.VcWoSa}Aa)[ ( St2:֧l#h6lY 0TWbiGc[LHiSػ8}AD5 Q{-HΌ XLES/aXB}{:x(۴񺁃}Anh#nȼss>PQjqs:IuBY&i۔KUb !q}A=?|j|%3df)" *ߴ4ˀPW噴=@0;k$W ZԖ}A:um {eiԄubVkD՞X?%"z+}AP$Vz?iTBF/HRW苼)v;5WSSI}AvI"G:M$V7Y:]D139@fNȗ;gQ b}A7v+K^(xLg;;}ڀgH&簏~#mo`}AϽ]<*# sVrvMK$rѽb*qļUv 5ڮk}AA{0Zdf"'_|dcHSv9(M{cr]bpty>yH$J$}AU{a ҥ i fС *}|ͮ$0g64E~(\*}ALiLe$wA5"ok%Zp2`# %LǏөۺYdn j[t#y}A%գU1:/6r2f*YBoW^3\2ھEfD`i2eIND}A4`ܐPۀXViPtU^e͒ME1LG|Br>fM雮ˏ =i^EXC[pZn? '^\B{WˇV!wX澓K_{7IekMDsAzIx2'Me&֬fE1gOOPōDsA"(RsQb|כ >WpoIC(1MF*9 S 4bBۿ.%E@&:NT°z5;Leu b.PmkB7r|'ԓo(Zۈ{(bvPAMIۀBR: ur,,F[oБ!h~~MQIh#;$ƀsfsҝ<3ɞ-yȲenݒM/ƫz2BT1uF%K*&:4RaЪyA)܁RstyNX$؏l8ՒM弑+FW}ʃʔIG[V=XTM|!q(dX}]iv mQʡBgSI}3Q,$wtoxz(M9:43˞6; C1NQ q~`ۊ KAbwT:vU-Z݃HqPgFW2!(eq0{y3JM Rϲ RA3Gg,h  /d)Ɨ"NR%r[H7o<} ,2{YK.׬Ms%NY!YpL MCFh0nivDV`c2]Rt C ·]\Q>M&bft13|D"yT6.,5xgg mאA }#!nGT(PqEMV c\7\MEVnG LM&!:wg3oK_L Gb'5 -_>8tQd2-WEWR I?eͧMOrX]"aWB^U(ۍbbX‹ TqjVNLܚehЗPsl$)h7e¨RfMRGC#]IjEs IUJe 9F2rv\^Yh9aP.p-eL;,n~˧lܳ~3M)>u5<79yW{A+ ?>O xU,N 2^cTa̚ـMM0nMGl$s;j8s9mdP)o_KZXCG_xl;<% 6 j a1 pA{Mm."EB ( LH/t ?I~q1GZƄv0F׵#;2kh}| Ҷ5̒A4xQnnu{郣/q5+lY26 Uzg$ sp :I;ԉY-ȒAÏ"TxJ-qMI^)S9t87ƶv^Mh蒡ؼ?@P U$Ԙ!A S+tzť Yad4Zt#"~{3kl@$!3Tӣzn\% ٓ {`kA'Db`R 4O2Τ(\C(W5"@m ԋ/@]B8"M@ z }'h^be:AN`aTJRDQdQSc'"rLJfl9ZvlJj̓H't#nK9qϭM} ŎY 0>_P7//yl(ߍ$`'~*}ik xIQݝZ,JKoҮߙm5`"7g wL+n< .$b@8df(hCssZ(V(7&͚d\NE;6؇Q&w8ړ&&2ۥ'R"(:[GnI)\{ˑ?,. hy^=3Ţ_i#p$Ӆ $<JELEFh^KbGٵtO&t,_pݵj)oaTTVYw#ZLN V$V ㋌_=j j9G_ Ta@e;"}쇁Ȍ@Xq&m"FeҨzLwHjz\u%U=n}g]igYeGe1# L)νg!U>oR/ h>;2~u[.`{1o҉MtҏْG^Bߞphw5Y!Y M #sG1mK.sI5 ,m53GѤ6 bФDܭ%'_v2;3yO^C #zͫy],/?9r^a/Y־ fŰ9å91h-6 @2f<:k!$Ot~!3]4{,HB훸B}fs&QT'n(鶙V1Ζ @lbB)DZ!j󎌸FhY3cUϙIбb:br64FNɕm++sLCMm{XD Ok쭃wKZYpygc xKY{հazu!vNs6-wſ Q!տ~:afG`UP0BN:h.ffrYeт:dcM}#̒$ˇTNQ7"ly:ǴCH Tb.Y]py1qi(.aF+a'a0=Qԫ,G7u u95VB ^CMX0qMk%5Tq֋B`w$fVCDm?YgH՚PnÃڼ{NFO `V>]v% )N?wIvf5*ؚ}fv p1e|>CRc&bQEq=n THqCa[NSn}nB4ƃȀP`>;8!.T-z2MkvnEy YԀ_bt<aߟn*h:Obɏ| PIM OԬEvbU Y H$Y 8+cZ #cj㲏g]0" 9>g\1 GR{K",(0ZũťR.5yϧ4wq?ZJX|82xbUh +au/v9B?()s1 "UQ=J##Ǚ}bR CL䚰wz.|6(U:. M@6L/癝aրoA]$#}dF!B_{|ӗǫ3pn+x9d B $5?5E|xj߿"jgyZr /q蘔t7QQc(0wΑ >`CLa& W ΢:P}BmK$@|j pBu*c$ a:2 fDQu dIz<6#QkCg"g>(Y"R |`pK@CJBNKo!Ճaq=z40( :8o*X'Kel"$l/3غ y;loñF r"^V&UԿJG[Yzx_6w6JuLކ㞯1aa,o:':@ f,ZIpKKA2%:$֚>}l@|Xohе@Oܒ[.f;ίCgv=@; T!Gy`wiJg#N=7 V1l`Vɂ mՋ#pJywP"Eyw`/ϘZXzz5WA5t Di6%/o}M9ZF[jZɼK,N 4:*ku;3BԎ@_nd(ʩ|;wGF[&KP2Jy^g}]ن{= 3<>S@q9:o=a{Ru3lq]BNye|{J4axJG'AE@o3gIl ut2 vz\ZTw&vU<^(GW* IpF@}m8m#_%VSc;P lnTttCzaՊJa!N KG?5cy$y:K2֭9jgMы۟S51g6,9d.l$־4]SǪ C6saMSVLXNJbs6#Bh\nUHvȳcwfX޼ۉi[H/׃^U{xS}vԀ]lqday~`b:p_:WWvP9J<ø(JʇM1H3bX 1L00lvjۜo [mz }\ E6q>bx‹պjpv:aTT(H?B?A(|@~Y{RuM v j裒U I4-z0<8I^_ص>5厑Tn 3o=i*ye-'Ƃcv3-f JyL{ZG=0,ta4nQaN w԰Noyי6p4`E`;B]Ogbw3;REew#>kהK .!ʗZ~5ԣ*7R^-֠y _nLne ?ILӪm ؍W DcݚY`QtC rZ?=lYuW:# ,G`?BH% 8/ÆǾ!^<Ϗ BLJsMU xgi{(_#1B" "#Mt׷AdzAfm>f en~)3҇Lܖ|uTQi^G{=(L\l#넖/2?^*7TOt2US-%]gzzrB\k ťN&fw?O@QO-gF;H|zx/庲ܕRNi]odPK$g@h Ht  l%率~3Ḵޔ+w|R:nb/E8C)9GzSL#ظ ŗti~^K^iSkѨBޙp #kǎ> 3\ɋ nȡ3 *`բ J  ^eG4\涵a5,z$.YH_tS~GVk~?T]?KTu 4Dώjڡ̤=L;QkɃKm Vk,kێ9}S=HZb " Rˡ+ ! h ('h ,gXG4YK PșH ŇI!}$HAx5rsvE;IؚO%"gqxXj-3~=MLfm"v@]lE6r|`?qpɉc#}Ȕ_uKAمwި6e hnhlѧ0pЫ r2sku ' XUz_UF)W)  (f)IL?"fa)|#܀ /ON6eR>&{UB{KpnZ~Y'QsÛw\U֎^O3ZoUmf.ݩ&kn {l)H#cׇJ2kG'}{휖IgK,&6cCӗ(d>h>zv9Zj =6y4w8\`ݦ1O gQ-֯r[vN Eh Oh+'0@Hh 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@,m4@7!4 ՜.+,0 PXd lt| ' Sheet1  Worksheets  !"#$%&()*+,-.Root Entry FWorkbook=SummaryInformation(DocumentSummaryInformation8'msoffcrypto-tool-4.10.1/tests/inputs/plain.xls0000664000372000037200000006200013520721054022301 0ustar travistravis00000000000000ࡱ> 0/ '\p Ba==|mB8X@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri""#,##0_);\(""#,##0\)!""#,##0_);[Red]\(""#,##0\)"""#,##0.00_);\(""#,##0.00\)'"""#,##0.00_);[Red]\(""#,##0.00\)7*2_(""* #,##0_);_(""* \(#,##0\);_(""* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_(""* #,##0.00_);_(""* \(#,##0.00\);_(""* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>  ||>h }-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 W00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)    }}9 ???00\);_(*;_(@_) ??? ??? ??? ???}}) }00\);_(*;_(@_)    }A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ??? ???}-}= 00\);_(*}}8 00\);_(*;_(@_)    }-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 Dr % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 [ % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%Dr2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %DrDr= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight16`2;Sheet1a| lorem ipsum - cc  PK![Content_Types].xmlN0EH-J@%ǎǢ|ș$زULTB l,3;rØJB+$G]7O٭VGR.e1a$n%N91G7Z(Lj$>{ҿQ>HjlIh촪b-{gv|g'=/:~E[7 r!7\&0;9$4 kas6r}SXi٬ kGAsPZxC}s7T A`?^R|{֯A)oViנt] f9dQ)/P yt),b-FO@)$zh QGpED 0\UF:W@?i i !SNy?yW޼W6Veda?~ǗH }˯S+.Lۯ_:w9:1c# $BĒ@v_#m' xg:J3F{; pOeXxJ=B5w%%WRُE!ED `)Ǝ}Nec2L>'^I& B ڲǨk|f#a[ ?2(v?B2r O/0epp<^ ø~Lױ䒜t!L䀝#/]1I"8EC&]cf~@^w?!rcH&"@7+̬aWʮ]N[->˜s4{A--FU+";V{IMGDX!; z+Q#O}i!T9g*}@&>itWYK w忋1ؗO-ؗ /-ݔym&Z3A`-X/DT]b+޴1$l~ڞ8vix܊uVg_J9jpۚZ%1Tݜu\w5}Wo/_2:^Ƈ㺗NV>N/S/٨ӎG{|ұ\S|$_4 *9}܉#en8#,Dz!%pbc6KO:UuVVd1^ q8),NrBn(ː0&I$Ae$} Fs+(,-~@- z!8|z]̏}ƴ"ZMn+{VM)u[}B^%UVLfQSwӰ٨];6  #76jt0xrQ CM_-[mvBv9h{4my&Oފv~-*pX A R7 aX zPXdW~Wt]xsKsc2eM\_Wk/=Iy6j۽F]J*^i7A?lG/|Ln4RFEoK͠Vnkt_dm @ggD Oh+'0@HT` 'Microsoft Macintosh Excel@[I@퐵I ՜.+,0 PXd lt| ' Sheet1  Worksheets  !"#$%&()*+,-.Root Entry FWorkbook =SummaryInformation(DocumentSummaryInformation8'msoffcrypto-tool-4.10.1/tests/inputs/example_password.xlsx0000664000372000037200000003500013520721054024743 0ustar travistravis00000000000000ࡱ>  Root Entry ; sEncryptedPackage" DataSpaces sC sVersionL <Microsoft.Container.DataSpacesh EncryptedPackage2StrongEncryptionDataSpace2StrongEncryptionTransformXL{FF9A3F03-56EF-4613-BDD5-5A41C1D07246}NMicrosoft.Container.EncryptionTransformDataSpaceMappDataSpaceInfo s sStrongEncryptionDataSpace4@TransformInfo sC sStrongEncryptionTransform4 sC sPrimaryEncryptionInfo @ Gc`q@}_7F ! nojv2p.Dh"bLHz$a2"NNxs-ԳN.a78y1KR \EI:ynr Sv`?,;ʥ77Q :/ڼeӉl:.B/Sw;^ݣX_.xVʾ"8[a 8(?D~Qd^pds&g6շ~2뻾‰.r qA˸^Dl,Au%lW>ZZ}ީ@fo̅S5R'U Þ2q}C^=GHGެL 6%y;-z-pH; &_OY|twI3e[g Uq[,E.C6I++a#Yel¥M7=GȂt~feΦQsw0@W=Z$8ΆM*AtM#Pt˯Zt+`b3I8rO'jFCs%ug+5E(G8͓etub&K{IqTDliH4 ݡ)Mnch#mKLâ"kMs $Sl0dtBg}o6t!-| X\#|{1S y*NKs^O:o+b!+4 pzE$Z^6#/٣S++Ou%ύҔ:0 `TC%`;di% >z]=8-gÌX O%@29cjOu;n|CD0 VwɊU%& EvY.e:?;`pRFr)H[]ď=%q{#'{-]n]nPV.jmru.'*X]VG4T4hwJ7(Pd×|(|NH*d.QrX90Q?xsDXki`pNMNJ4/YRnus_ĺOpXiX<ږ"82g#P%צ<$jh/fI f J֜iW6?d-y eX+{y}&|^^I폶 o݋= Oͨ{̬AD@Kj e3hz y@q e)Pj @|r?.N9Mˉch]SJl>9bTaCm^a ۖfVNNqxjI+mwgJ"3MU->]4`ضru7/`}q. T!OIWn0pWr ?  E{,dt%Z@!1H4cI"KYÜ'T~U.4^$ Sň(1ʘnFr qA|x;[L$2q9FLF[zxfm WXIJuvh?knKװ9=pDC ]PN]KΓq-:8$PI O-/{Y9iRdˡ6rf~ Ҙ̕o Y%4vPi٥If#Ǖёl'{-im&^H/zfpeۺĄBjcf F _rl'j'(эhoˋӣ=̔APIra|G#"gÒʿc ;W2x|;D;gakQ:!}ע54њ@D)te͝.Pt+o Vεی\Hlyʬv3!vxiӄ#H)]`D_zM&f M'}&Eq]D(#2"4h|Ny ,mf] u#m\߄vƪ/wG̻*]_hڸ>..{b"U0nAcyeņK+tàP XH-[ZΏ䧆IEy"uR۝FfY*p:L-{,+">ɸX= $\wߢ !zs|>ZH_j.Lfg@"bmI?)R&k| Yٯ8ȭI۪wӯBcAf[- 6 Fl\dzg&ԹlEg!e}$';ծ԰9h4j#T'.LqeNۏmR#W&"ՃK2e~S f- YS$@z*~^N3ȥ5%1ye} )'a܊şZ@Ru Y//$ʤ3V^vmn% ~:K~Tr$@Ϫ-"A~( qve7Kok `yUuU#Zqz_v#Bcuqy#lD7T_X5ܝN`RX<ӊZGK7美D=_Q:S_*224>)B vޛڏ X淜&6Ho:^pP7…q60m32gh<Բ](Vɿ'өGŒ96誾L_uoA0=N]젶 #-rV=5FD%4j9pu "_nA`ѕM ?XS{sFZ?sc硹4=Z5YRV ^b55r&].z'9`I ()-n!d{$)2d[/;ôEks8#VJCeC\dNoOj|Qp* 5H9˲MVp*ZHz15QFXV4Sп@,<&3DZ= {e}ТԆMϪ9%6R$X4Wd-,^ݖyˆیV¦6D"(&0#4K4V// ݛ9%-Iޜ;i¥#&!G9,\i *"5u߁Rx"8y+<Ċ-cbgk9}O NĺT)#x2]ja9HڧM=o LJ%k8dvlܤm9 uq5 q);pJll[1$!slKRpw;;*:Tpt5DDg U %'Q*DL+Pv> xEJAG2rW˩ld`l'‹EF`JZvbxE*N\HuX9ӪKnitЂ_%+@x0{3')XwxOs|/S.f1ҹxkX`vm]cy ؁D$\2m[ȴM,-0{aɔ#^>qdc+phV! A0HUݲ0.i.s 6K#8b ۣT4Kdl`fM,uXPSر/ J%$wVM(0)MyÇ$[kḇ-ӧ0hxx'op4F@4ⓁT u&mjftznd8-.H|Cٛu>;tln~oQGOFݤ|UyO1(<(9}%v'aJUb^I[:=4қ?%'PJ+ޓG!hgUN&,ȕ'K2GANk򥶛8H's#籆:PnWMGIem>-T885u4=D%!LA#*g":\5+O̻jO=^2 n :Ats^} f}dQZ {zhD'Up=HV$%SLIdͻAN,q pg.*{|j~$#w䝏 e!șkV~ݣFnrN7FLDô = s#h[oINuyv*~[%avMcr$r՚zsv$3tXjK3ѣ.E=kX8V_ljq6,6e ~-*;uz<%H{CQ2r-Z Ar$a7=O, SI:@,=vvh]=X̯ɄI xFԃZշc?F]@x҉WwLy8+[8ZXn¬O N*yz|o.0{hry!_1 @G[4|I+E,EN`gS~"X$,p2޵YLшq7Y}UH/)^+ Lh',A$㲉=[g+5xvL+(i*O$ J$ a͍մf1Ae^ibdRA$LIN'$ԛ":Ϙ2c7I הDywky )9fi_q'Ajm8M/߾ 4Oomb ;m4q*KB~ xqJCʋ#ikwc3;BVHB*Q=@dEq͎Eqnir2vʼ˰EBz^4k;1Ǎ o:EnڻU<>}i^WDA'c2XBַ 4o7[@V9`nl~n,.vI5]F=8̆B}%MX>e$1Ͽ%ZY =!+LWLL:?CMfFum:,Oac p`ʖ MEF`x0mP$D} } X>qV^߽WHӃE.qgE]N WrG>[LHGZfÔ839',\ß wTdUBXV*_Gh8*HTa2D!ˢ2LI[WIGa`Д1s.Ђ^6ݯxD.,aN;C#0h (5:iB:*kzxsOq̢{;VX'y%G]?pUx5g.0|?0/(КuO*&nRg H*Ƴ ;-m&܀Mݷ.w5)]̔fGf<@1X}I Bc;8#eଯ޾qkd3FtMA4]۱ *:㸘WݛYbƎ}Seճ )qM7uC-7c ۢrW&zݿw%k/\4<@tn*@H h},0El_&C[ݖOV&8y+Eҩ6j3cE}رnGirvQjv1j@EHAzz갘wBH$˓H]8&:):;#Ӊj'M.[m,VS19Nƫ1WݻU7= L?9.cvسWi@*JM_A[*LPl.v_hh+.6h '㞀V%Hxz  :\gӮG)K аÄLC)UwCr"xvw'0nsO\ux}7ި \ ƍ DȧԄȨS)t=Lnjȱ&|=*L09ATnc!\젖J<[,\jҠkS{$ـ}]ǝͰ(\}jqkG`xi2CT˒d /eg2!2//E~! ZΠ-o6;UTl$j^IHz5Ƌ>-mo=[' ug؝-BjN[6,/Z  ,M:H^7=YܺYWOmֵyح.ǶJyLلe~3q+U|K I`ܟsR:D+c~`\^Af'WKZ Mij4hw\J)9tPDaZ<^YWVvHA6j0W2-HS.& sHܿӂxaºb€{cEE qT!g+w-_X0RlڦyX- \F_gƚjkR7.FZש2&ۖB-&vd$0l~Y"Xn<ækwuGIPRanCTVERDmw=="/>msoffcrypto-tool-4.10.1/tests/inputs/example_password.docx0000664000372000037200000004400013520721054024702 0ustar travistravis00000000000000ࡱ> !  "Root Entry CtEncryptedPackage" .DataSpacesp>tv@tVersionL <Microsoft.Container.DataSpacesh EncryptedPackage2StrongEncryptionDataSpace2StrongEncryptionTransformXL{FF9A3F03-56EF-4613-BDD5-5A41C1D07246}NMicrosoft.Container.EncryptionTransformDataSpaceMappDataSpaceInfo?t?tStrongEncryptionDataSpace4@TransformInfo?tv@tStrongEncryptionTransform4 ?tv@tPrimaryEncryptionInfo @ g,t܊#[j]*M=:VlHnAp7xr:cfhg|VQqݭ>[C;C$g;ZQr)ki[J^\D^ k0A`M!ݖZYt$0a3D#|ؑ"s$$#N֯z`Ir4K%hxMsA^(uCVe&Jf,MLLHa>!<@Y-JɫF2 E,JZ^3e4RXb =jjX?03]8țڔcW[KTGp+~ ~l\G/#$ZMCtǺby^0G_QKگ)aؽSyFj;2$ ^@` V:SAv?b!k[ !GuMG3F!:LWzs#CBիnaf^E.]5uSO?L@4>IZ񼿸N逓󕊹^Z!N;hs}ig#(D'.ntmGЗ1 ֒ۈN$JЧ p@KAoYS@@D-WgaP6#{6Bu'P"?|vBf d:9te;8I`aA B{Vuv GB&]ʠI)ț[^T4&Eg ;dpT[_3_ێw<Ž:zuMYfɚM_kk /#v''|!xL5e4L/,*R9-ő?r}(g*W+i֤=95H`;"(L9cZ5)s%2 C0]}&Țu>$ym1h"[l>Ay63gS+E&_$qju:L4x:fwk,2POA}JY-ʽetb?NLSDuvF4;0#m }'?u ^I ShQ"t@U6mN/ (>E@(&v< >yn]"["Qq$:Mo~̭x?v/PQ*Jm? [Ö5ޝE6=\"4~fr ߤ 9Dɛ/*7d-K@aуuHWB(e겊Y5j>L"ke`@y c8%0Df5 JEͧkͭA]Aᒧ{͗YhҢIBAk^Ih*wiÆJ}>Rq 5X%K6OE"Pm9h7Q'Z]%LBC$ @9S W%t;hR@a|1f[ZH?Au|T/A .QFQIܸB%MenudNZCrM Jܙ8oTz=Blb~z=.:΂k/Br7}3?+ٟaKJإ6Ϣ/uB"sӒnpjlMôEN~ c}ZZU\l2nlú`'Tua/^߀*Y)߂=qj|=>όt<_Dؐ}u:囵<-gAc L$:rsfq%52@_T{l7ACnOP qq+PryarGT1=HJ44mMl{1>Hgs;ىDjM {D[2@@a/NuJ35iqѢEbA]7xVRyCGUN%Q+YO7p(!s 3lu΂FAU}yH[rg j q84*WZ  O'.qWL`ki-8E궬vqHQRW^-gO8ז.RNTc&6lB]ܤxN2~ۮjd:ڦ TWq5Wm~"v=*8'x)T?4l|K /SYsRcX,=#KhMSA2Y8$"r,6KN.ɥgʈ{iAcl4PTݐ_h +wxj ,='4}l(}tRzgMvD[c3洅̂?!$uܵ\+` Rm,f% ẅ㋤¦^A} X%=7Pd'IJm3殧=)+!+c?0 ho=J n+a8Bg<bĤJwF07VYD{tad}Ī%ޝaS @|/bGi$qk;l\ɢJEh@#RE&vTe?6F6b!=֗pR`I2tpk#ʦOxqn6X~o1m֖Ǐ [,b_\+x8PxSirun\: s[ -;e5L]*6<@8?u˿>X,`Јn$y>])N6@E@{ ).`jI/mO7f㐨FVݕ".VQOi@.D9DHt@yr'C+)AR)p!fr[9H };`-SHP"#,V8(b1r*ؤ6GwJl:KsUOiq@Y ?KWN==2uV$k4ޛe2],:06xIAɸ>Pz瘕Ψj+%gAb `yPŽ*rUIGfs*С-ۡ >a57Xp(^@s._,=fu?f5D@B2VA /C6^C ȩ gbDDCPElKSP>5$xz<_8\Q\f5W'V=m a=[.]X=e6w$gFfzԺdi:Wg^;0bZ/|jQI?Fxp(Us.4TJ-C]7,4ӓ)dz^phP*gh¯ )JE%C2rgEIiw!]s{*Y!Zaw1DbGN*aoNցW]پ4~?6s 6=TovZIt,nTä)qAV $۟FgM4b }"֎?rZEyQ)T|vrT꒛G-C"Fv!Uuxߏ5a(acRT ̹g)>wynv^H̏=DE)XzW1a zɭ߽7VP#QdbV̀ \#ӤU0}CۤLn;T,7 ̪J K-^| InY18.}mTv2(S%eXN bVծ=L-KZ$0*Vv[Mҿ7] L}ΤVb˝:)Dbwү/<4Lc8GW+8B ߊ8ˆ㧫 TInÑoAr8m]\'Wz L ] 8FY,Wjao2@)JفBN2-!O2CNQJ'dw3+0Y-n|#qֿy軕'd,H:3$h=k1J?-*gbFX- ,Z>qR.Lfy*A9B(J`ę{{]'\J$;~vA.aW*ERw“#B;IKE|!{wzV,又HCPnZnW0T4 kV%Q; J(?ݎ樇 O~lպg;Wbru[Ā axJ<5?~c%Tg׀ ڟf+_#>!_U\i"&Y B8RX7{f4(*9|Jp X<Q~4 /@; }t%eg')b_өv{J˚hڄ@@c_Jia[iO+>U&1dm8ftwYhu)B9j;y& #\#=f8e[>f]%  ~㈦KSzKX'B9lM MuyOx]V휮뻈R p+sr|e@2^t`eT7V0]4;`,^ #CEWJJ=cbE{xdKf˜r'IDC:ǀh "+^0FF 8[/9L\,δsCVnRZ6o Sj IT['q`.CM %ůG%`FSA3^.Km-ܰk+OR5~\l~Rs7ysJ6 pZG>qir;lM;l2-ܦި.qq=fR> c4ԡv6[/z}-=;u̇Dkt .[6YiA3 y]j9 E;Qg&Q%): zE W$ʚ@F_kBnwrei,=5+wyFa @iq%;l- m&R1|` kE9p뢴U܋r2[a $[{du]p#zv|r^~*ɰ"Cܮhlݕw(+p?0W'l德$F5:2%Y{Y1\߼">:V>3if(y,.;|%.:hkn㎘.QH јG0@xT Y#|Wk?TuV,ícY[n&4QGIE9#=eS6GL؞]cs?MQOѲAjlZU(D6hЫ M&|S32*Yr R4lqj0ONaWg曃@ Փ$CpE<Ȱ텘lz}TNv'tS;.YLFMEZrJDTzĞ'3-k)g\!|*UG#-s <16bP- ß0DĚR 7O5~Y7WT2޳/SS\}"؏WydFßI$il= pqҽE|,]ͺd+:f߁۔$7`իZ()"9k v5΍}GS(10ooɕ(S'd5>92*::S{s,ǪCg,~coyj7ޝxKQly`a+b؀{6KW mڼum$>>4}( %|-yk ñJ5i_3)@,Uߔd( MVʨobbpv{R<+}j,!7 %[:n҈7=[:iR̨bx'FT \7ihY"slAcTةʻzs>,[i[\~z(_gm┍; Fx0\<nDp2j),vڶ)'],!UQ8x7>W.G[[| X]|oj:W}gKʲF\Tr`h}e'o\5[C:pngrnHx5[6R B\M_:D:P0Oꃉx 0h&tCﲿ i_؈Y_B)' ",j]@DKD4/ u_$Z[olRΓܘ`:O^ѭ \&֤|ࢎm|+-v^͠[&k"7qz#6!5'x) tFH nٱi:cj2H22BcZ)h$.RAy8 ujd~Ti%vp-oi|Jۇ[Ǥ挶֦|Ͷ~y8 I+[˫H)첖#"QLdK#-8H$MSwGLmNw&?Җ'CV8?[y4Q+nUsn*#&3#!}IsvYKD(YTrC bx]=MŠTN.A^nX]_꼾ݽs/tYNu.ҍus]q_<1 zM@9et$, ==TFnYR8 E ?6YMb9p0VZ~ecne fU`ky?kAi(");~0+e(EhC1MCҥ1ȶxKN,t 6C@pߌ; y۽jB[]X|H1ù;TPSrE^adOEr,仃O̔*ST-s>B%SWq̆aDڀJسa,+ FWE؏ÿ@=˞6E$*60Xw`&A&+.QqHT߂|C?梩J?A ,.L LlÍ`o>!;硔b$ Zlu7SB3ck-wyJV98Cґ,^놪dFѪoAf` K ϶%G@arJRKHJ%N:"A ?b४/D^⿫xLŏ=6'daĠlMDW+K\ݨ7/go ps%VMFlPo3XdFcahzJw=="/>msoffcrypto-tool-4.10.1/tests/inputs/plain.doc0000664000372000037200000005400013520721054022241 0ustar travistravis00000000000000ࡱ> ')&  bjbj 4__<<  z$H*43V J0zr rr$zr< G:  hl21h:pxe|. A!"#$% w666666666vvvvvvvvv666666>6666666666666666666666666666666666666666666666666hH66666666666666666666666666666666666666666666666666666666666666666p62&6FVfv2(&6FVfv&6FVfv&6FVfv&6FVfv&6FVfv&6FVfv8XV~ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0@6666 OJPJQJ_HmH nHsH tHD`D NormalCJ_HaJmH nHsH tHDA D Default Paragraph FontRiR 0 Table Normal4 l4a (k ( 0No List PK![Content_Types].xmlN0EH-J@%ǎǢ|ș$زULTB l,3;rØJB+$G]7O٭VGRU1a$N% ʣꂣKЛjVkUDRKQj/dR*SxMPsʧJ5$4vq^WCʽ D{>̳`3REB=꽻Ut Qy@֐\.X7<:+& 0h @>nƭBVqu ѡ{5kP?O&Cנ Aw0kPo۵(h[5($=CVs]mY2zw`nKDC]j%KXK 'P@$I=Y%C%gx'$!V(ekڤք'Qt!x7xbJ7 o߼W_y|nʒ;Fido/_1z/L?>o_;9:33`=—S,FĔ觑@)R8elmEv|!ո/,Ә%qh|'1:`ij.̳u'k CZ^WcK0'E8S߱sˮdΙ`K}A"NșM1I/AeހQתGF@A~eh-QR9C 5 ~d"9 0exp<^!͸~J7䒜t L䈝c\)Ic8E&]Sf~@Aw?'r3Ȱ&2@7k}̬naWJ}N1XGVh`L%Z`=`VKb*X=z%"sI<&n| .qc:?7/N<Z*`]u-]e|aѸ¾|mH{m3CԚ .ÕnAr)[;-ݑ$$`:Ʊ>NVl%kv:Ns _OuCX=mO4m's߸d|0n;pt2e}:zOrgI( 'B='8\L`"Ǚ 4F+8JI$rՑVLvVxNN";fVYx-,JfV<+k>hP!aLfh:HHX WQXt,:JU{,Z BpB)sֻڙӇiE4(=U\.O. +x"aMB[F7x"ytѫиK-zz>F>75eo5C9Z%c7ܼ%6M2ˊ 9B" N "1(IzZ~>Yr]H+9pd\4n(Kg\V$=]B,lוDA=eX)Ly5ot e㈮bW3gp : j$/g*QjZTa!e9#i5*j5ö fE`514g{7vnO(^ ,j~V9;kvv"adV݊oTAn7jah+y^@ARhW.GMuO "/e5[s󿬅`Z'WfPt~f}kA'0z|>ܙ|Uw{@՘tAm'`4T֠2j ۣhvWwA9 ZNU+Awvhv36V`^PK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-![Content_Types].xmlPK-!֧6 0_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!g theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] lxev@@UnknownG*Ax Times New Roman5Symbol3. Arial7.*{$ CalibriC Yu Mincho8nfg_ Yu Gothic Light8n0000 LightC.,*{$ Calibri LightACambria Math"1hG+gG+gr0@P $P'v6!xx  Oh+'0d   , 8DLT\' Normal.dotm1Microsoft Office Word@@K@K ՜.+,0 `hpx  '  Title  !"#$%(Root Entry FV*1TablerWordDocumentSummaryInformation(DocumentSummaryInformation8CompObjr  F Microsoft Word 97-2003 Document MSWordDocWord.Document.89qmsoffcrypto-tool-4.10.1/tests/inputs/plain.ppt0000664000372000037200000012400013520721054022275 0ustar travistravis00000000000000ࡱ> Q   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNPRRoot EntrydO)є#OPowerPoint Document( 2SummaryInformation(DocumentSummaryInformation8l >1n[EVF67x؍K e?|.XYJ3fPܱTq-T]:]Һ f ?ݚpI6ϧr3}VǠgZw+`}㢢E((R7rEy|pOf-Yr_ N#ޕ_FT8&@* n4l6ZU Eu՘UxΥ3q|<}-d/pY}p#1ѷCHY_r6p6;T5'Q1πRgN\aVHu >DY!F;s䊳ACVWOiyC^W sP!(r ߗ9%^ W |6QElGGcS,?FE+<&gݥie긒9]h5,0M 6][?fʡ(~腍UфU>/7 >U8ty{05yuTl>hxdu7?rvT`B< !IkzON ޑ1ˋz "+R RhB.} /<^ITխ%rHK4uK~I0xM e`|X}đ I`߽N4aG2$RKIZ)4(M9`ctB{m:f@`3n|O,ܗr޾jxR0T ,0@}WBLǬ5vPK!7J drs/shapexml.xmlVn6?%Y#RXg?X5E $Y;$$PlP k(9fuqtdJR8 1bʺ9zWS!&\ 3_n,zxgL?4ݱ+3sT10T^1̈́!u|a6H+MV֢k: Ft֜Pf a Yi3@I "¹^Ew;js"]VIP$a2x<]Ɠ٣e3;̧C}ER%lH6MKh0;L(+*M`:-" opZ."|ģ|y ` z8 pt/~D#݅&/!s@<@$ ;8y_Hox'Sfi Fq:Batq6Nƿ!x;uήs^#!o.rTM8Q+'_!ݳ5hzAfwdo+YBm[F pKH`I ӰdG=H (lAbSbOt+{Qk מ>.P#+pK4㭽^!k%elݙ3[XH[E-?'@+Da%b6`2s6p?N ZK^M0'~5AС=6#`\XDҷ׫J?PK!5ddrs/downrev.xmlTMK@aDJѴ"jQ)qN>4;vi]y^j4ֲt .nVX܁YcgjyyLoiC-"} LJ_6dOlOwuC)M'od& 鱡;?E"v,a+u}5>x4!=̪W` z9Vor et ?PK-![Content_Types].xmlPK-!1_a ._rels/.relsPK-!7J )drs/shapexml.xmlPK-!5d^drs/downrev.xmlPKg  V*     ` ?*Footer Placeholder 4"PK![Content_Types].xmlJ0 ( / 0DCalibri"DArial DCalibri Light"@ .  @n?" dd@  @@`` tl  c $@(ʚ;DĔʚ;<4XڟXڟ֟G4UdUdX֟֟՟i)___PPT12 %0___PPT10 pp?  O  (PK!V[Content_Types].xml (|N0H+8 (8ĪVEBpֻ3iVwbl VLly Ё9!u{yL IuF^k2#z cẽN`0[mb` \!#s,Hё9}~TU 6Ul¼;{-dۡx/ ftΓCR}o v|i@T;\/E_PK! K& _rels/.rels ( 0nS=H^DtiUۛc a)hěBUrdk)Dd gIDr*dS("QlT3Q4b̜'օ9I]e3\0ťQ.D=vtr5aƓI+D#V0;f[e!/PK!tableStyles.xml I0@Ὁwh}-CQ$ +w*!@he/?JXd45ݤ{c@qqi` yߥ?" dZ@,v?" dZ@% @` n?" dd@   @@``@n?" dd@  @@``PR    @ ` ` p>>#cPK![Content_Types].xml|N0H+r@%r(0r&7yܪ}{&i*T8f;L6VT-{V~n^{)@ŀ< uw}l IvVNLTL3pG|ﴉ`(UoȮy=J2:88Z )9kR /Ju"(\fhnX soiɶGgϤqsJ8 `ֳ'*e$ ީ3/zPK!*8 _rels/.rels 0DnzЃXmlo0of5OIw AN{cݠv=m 838yG 6U} ShLq`L)d=Ҍ\@.;3, ;$e͂): vq}j:zɥ'k茜(f,ƁXA6\m>PK!82!drs/slideMasters/slideMaster1.xml_o0';D~XOՄFLbHVljlӕ=옒vTM"S~w1x(uO(* ,*+6A7Q,!10IОt1fVa% D0Rֱm4'%﫚0TqDgb`ȬY_m6EJ>V$L6B8X"/jqVFZ͉1zj{Dp*miG]`Hm6 Xwt?. g#Wi3E).+7 >ON ޑ1ˋz "+R RhB.} /<^ITխ%rHK4uK~I0xM e`|X}đ I`߽N4aG2$RKIZ)4(M9`ctB{m:f@`3n|O,ܗr޾jxR0T ,0@}WBLǬ5vPK!2rdrs/shapexml.xmlUmo8 ~A_/4;] E_d'ɹ(N{]?CH>Iݼ?ҍ9"jCޗ#m4~7Bw r7[{}%;&@WKKvi& 1aEӰ%p8n|(T90)ᄲ)" v2km R_wUoe٪L 4(VuP&*wdz KS5OmZ6uPq qQp)+UYI bijdV~P̓8 ]?ހKkIz^5;HƬn̹jhsOOP!S'Qo>dqUHme9N2E67qέ4l@Fb-;G&X1j\#]8 =œ Ym;Un{zĈ:qB-lB=1N1\9s mcD $VbnOKTeù5pq4٘F3"8zvC(^RƹdK C/N Kݓ@pYgd- uj)"6 )1Ȟ^PpabQcG7t@,.=(X=ѽ 'd'ݼb7hw=vru뷏4.8CvqF<`Eli0!g9瘉O&WDhv>N5bBnс)6ںC ;N ;o[ Bn-\دj}~Y R!W0mFAvv kߵ"f䅂ꡱwMiPK!e5drs/downrev.xmlTj@a[XlUJE,Sizf$mv61}^J/?3|UoёeqRms;2)rpT B)"} TJ_TdЏmKw' ])KF%Ƀ4Xsl犊l9g~MM'ͣRa4b_B_{>S-sPK-![Content_Types].xmlPK-!1_a ._rels/.relsPK-!2r)drs/shapexml.xmlPK-!e5drs/downrev.xmlPK    B     l ?6Slide Number Placeholder 5"PK![Content_Types].xmlJ0*miG]`Hm6 Xwt?. g#Wi3E).+7 >ON ޑ1ˋz "+R RhB.} /<^ITխ%rHK4uK~I0xM e`|X}đ I`߽N4aG2$RKIZ)4(M9`ctB{m:f@`3n|O,ܗr޾jxR0T ,0@}WBLǬ5vPK!C> drs/shapexml.xmlVn6}/ Z(iH\;I9Iy(6P k(9sfuptdJR8 1bʲw9r[c!$\ 3_۩n,z`L; 4=+2sT 10TwV1̈́!5|a6hH- ]U֢7ǭBu #AuMB[N(;H^=dNfM '{ uעuXA.`N'A'u<*q=Q6C}*/9DwY45UR\Q dUՔ <(XbE I0`1O&Ae4?zr<0{{,=Hz/~#݅'7= sn6K !vD0_@kWdzTdmq"(B3U2_hsSpGi%$Ffb=[G&ߝX1j\#湼p,z$ک9-dy { 6;?H$t'PPptp@m9'"(cjk3gޛ=.?~ʤX%>+[Ri PԜ  hN10h:S+:>W>v@"?Lqx=kQfz{dvK;f2ޛX{۞ LF~ v$.v-u tK{"  V]|>ydngp{r-vOfx \ U 2xu4GyLx Y:pj:{[F`-r5u#W켢C{ϒr, A{]Pȝ0g^^`gRRkw7xm/[,VIY9[7f|sasGyQOPʪɺmDOKg+2gtkDM#~WT ,ZE~j{rK+}ڟw|7PK!mV!drs/downrev.xmlTJ1Ff)mZR*HW8nkɒz/?3|`ɇֱ(A\9rsu"Dd1)8Sjv'P_Z$41vjb8[)ZjFgDZl954sCա8ZeCX2oU;2Mc9imy0 U+د߾ d//PK-![Content_Types].xmlPK-!1_a ._rels/.relsPK-!C> )drs/shapexml.xmlPK-!mV!kdrs/downrev.xmlPKt0  X*  p  c $ ?",&PK![Content_Types].xmlJ0*miG]`Hm6 Xwt?. g#Wi3E).+7 >ON ޑ1ˋz "+R RhB.} /<^ITխ%rHK4uK~I0xM e`|X}đ I`߽N4aG2$RKIZ)4(M9`ctB{m:f@`3n|O,ܗr޾jxR0T ,0@}WBLǬ5vPK!kKdrs/shapexml.xmlMn1 FHC}I Fa #'Jޞ#$vl{8SS` R j}Al& a,8m '6B8QáJykck2&Kz'ZICEoڋzƢK c1 j80dɇ>=PK!|drs/downrev.xmlLAK@a(X$ͦA츉fgCvz^1c|XNS# lz"mx@ńl L~(²4}Cf <\S=Gc./BdhJ 8v~(lvl Hɼ=. PK-![Content_Types].xmlPK-!1_a ._rels/.relsPK-!kK)drs/shapexml.xmlPK-!|drs/downrev.xmlPK DTjDr}1cOr80___PPT10." ɽ PK![Content_Types].xmlN0EH-J@%ǎǢ|ș$زULTB l,3;rØJB+$G]7O٭VÇ`hנ÷kaжkPBIvfYm Y0zw`nʷ(2 CIyr 4(%gx'$N (ckڸք'Qt!x7xbR7 o߼zbnʒ;FYl?/_|]0û}a[Sw?w_;9:3Sb=—S4AĔg@R8dbEv|!ոW/,“$qh|1:`ij.U'+ ,/VKȱĥ2JE ED1ΰwc IJ)q&Bz_o$SrfEV蘤 ۲sokC|a#ao ?2}(u?A2qčOǘ2o4BdsXfn?FrI]:Oc&rΣKvB~.!DI;DPv l 2Ii w>fVNt+yj>'b+O01}`0`K[*X=z%"sIqb+e]9RwC&b|N>fV d?ov6Ϸ̡㶟ϸg#l[nԱG~ܣ҃g? BD)>G>Y2GU` se EG߸jP+?=D@NE+?xW;cz16{[Ow׃SC HfЖ Hpj*4֥=e =֖F>75feo5CZc1ܿ$7M2˒ 9D" N R"1(I{Z~>Yr]H+9pdX4n(K篐\V$ =I]B,lוD B=XȶSkI]&(f2:t[iX30IQbU`MZմ9UBrFL+b 2c˛yĐ ݔ亝>`~{`PNfQSӰŨ];6  #6jwVt0xrQ CM_-mvBw9h{ mPK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!y|:!drs/slideLayouts/slideLayout1.xmlV]o0}G?Xy4"4iIx7D8qdNQxɇ}97~whS!͝waoJ7uT0;G*woLN!dNTy$5m=`nE;` }?Ztΐ/.mChɮ 2~Y7KzA%%cbԦQA&^a&p@Y u/̐GЃ2aJuB u'L@M&0AKՙho\*xZNyA&t#XN4sGYdUn On籛[Q 2G$$'b \"kFkxfG-bI7 tVΦQ&M`f :Y20s7:Jj:ҥUI}ٔ6h{C 5xhIt3% <7AVAF1!XB::jOܡXjaTkud 3\ aAhޯmZ,YC!nTT kh1 < 3a*ӄwѩ&欂BGC?,V~1q?Ynǹ[ŪL~9/ ߿pbB7(2" 1u/cwe\הp*0ԍ03`wB_l_<=ۯ%!drs/slideLayouts/slideLayout1.xmlUQo0~`BT! ӤvtqUd u˴0}ߝ/.@;4XCeɛ)[#mHS!6㇋6Ӣ"50)i3״b5ge HU/ص Hp>IYc:1xV1 0eHBPcvFxӕ(QCjXs#o`)hƙvjWr_w Ң(f3XH$oT= T;'8 @ۤϻyŖVWP2:N'bkfh,0?_Wʋ_2LA-d2~E@JA-}=]] J Z^;t%:epz#z i3eyoI2sL$pxneIff 2tMa &ڥ (@e8&>V*)J8.6(&tNEܛq(qyI`H*Ө;t(s@aIJiX/ /$vi\_?v8WD*]1*a cİ쭸WF,V .t*DB]f7/mpb wPK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!>!drs/slideLayouts/slideLayout1.xmlPKUK PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!@N!drs/slideLayouts/slideLayout1.xmlXmo6>`AAbI6mm֨@T#XNRPcŝmYޖv~ɽuZEĖZ{Zկn&-^zLݝRd0hU}U7L\Qˊ(x$vp*R ׮lQ}ń2 q@vW6m\H^}oMIo>d_9sҠZmn$c(-fݬ^NE( ӯ`0xC"c!dqSwOXD&j>W Y[~Czmỏ>NT9h(u:-ŝkkKѡl:!)pP6KԄ<ف#V" /:aBaQ,)2 ' HAg"LzI34D  M @D`-Ӊ9@%%b3 `b"`WeU د_VO~ HOtZ\IlM2&нXꕘ /uCZKƢ^ɺ.p*)(?j'ŀ}pt_X-º`0vYoe<`Lmq|9<Ϛ .#8\,fqwh†0 I4]΂ gf-x*M;,D2Vxuzv؃<0pw,OЌc)ڡ$G /Cu~fyb5+X.a5%6V<0S9 L+9@&xUVgXni5+鞳{]xB2a;!ƚ`,7g.:EhӨe`K'LrCT itϓE+ӨB  ƀ/"Z3略ʡH[܋ዼ0X>F'Fx4A!Rn|9nU R=`?9K4l X˭.C]b `;Tjl~7oYSQx0 O *42z&+ S]d_T\Y?`RXTS_[9*O3_1PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!aBp!drs/slideLayouts/slideLayout1.xmlPK`PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!)zOr!drs/slideLayouts/slideLayout1.xmlTn0 }88EÀt)4Yʒ )Y^JmC_,"s(o.-GgM#E#&q, 12p)X;f뗹 6'CVahhZb&R1g[baaonyOYؒF!_&_ ewZ&l'7ü>43-v l+xgpFx -8. 0wb^3,qN=hQS9!K?H$t@dB";雗bi :/ \;zN$$tuБ%'KR5k =Q,e9~$lǙW 9`wv }BV"V5cF~EkoP@eL'_y {g=t@^y=0PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!)zOr!drs/slideLayouts/slideLayout1.xmlPKP3PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!@qD|!drs/slideLayouts/slideLayout1.xmlX]o8}_i 66QQZ36iIkMd"Q/_~z3mTu*/ ]KHiq?ѿ.BZ"(Mjկ\:V 0z'ihTG$(-EQ\γ1 kлՐbL$:O7J˺G+UR}R-a̓X<.ݟWx+4b9E^*EJ٦VRln+-%@Quf걀fp3zGe_]1dC{@V^'/husmh=vF!ti%LnU:ѿ!,(;D "oF]ә;i#{ckU8ӨX6G8z80&=t,jGR:BвiX.3, \[A>KL٩\idvGEt߾Vbx1]ہÄ e$$Yf7V,0H ]GO[*qV7f%JC4Cpf\@_͕7ZMRib(2=\XdR~,)IRRϷb2.xv:EĝMy,1g2o.ɨ5 @/W [ƭv%4fێ݊!PiVJ]+^nlaPZ*[n8Y ':Rw4P:@̆28FPCu1U A1P6Vxjy=X8*J@S0Z{653v VbuVbDn%VZ)$*kBU`9,],*OWdWd_ ,σl21([!;EA8QPy=CgR7Cf,ʲRxJr[.S˛bߜ̰m%ٴ%NVy1O"QZl섎#,G\j8rRCi [a<27x;]>9h S !ħ~˅zMEךWquZ뗬c DiҞV×[ ߨ?TԱV`#)okvkyy'@Y%p@G5ʈeOҢMMJ1.I'حzwovG 5lٱdG%Wr JuxCL^FX2oy#""t:쬟D zR'ϳMwLlUD{vӢ4v;^14?[lE_9:UF.7T8w0ʪ00J> )A&[AC.A]5|fcX1K/mPfnn^FyTe8?h`]ok'y'A@Z:i'74Bx fP oϚk&Iک3FiЃ#]itRuRѶW5 FR b,=# 8kaU? 4cLd NݬJ37q:J1aSoxAsEgQ $gmA$:@? 2c8dmi٧C]3ϸXvц-bHLKu^\}Bu/@/Xz7I{w#U%o&LCh`eUl?q~y&Aj_{לEi.L&ќdpOzi&R/!^PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!D;Z !drs/slideLayouts/slideLayout1.xmlPK0!PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!  !drs/slideLayouts/slideLayout1.xmlWێ6}/ 7Ď$z\^ . RK@})r.gfC#ȞKUwo͝9DiVTt-;GW_ %;z5*ib;Pum'S>*IۍZΠ/wm=7ֈjvuFkk /!c*~r{6"-m`b:'(ȥYUo(KRWhdPvf f>[+-[,ni E;/(т4avgwdnB{ѷc8` ;GDϲ;2X2rK:2u L>LrS?_~MMNu[}úff1r G0J/kw]&W]gA`|$B 㿉R|Cl(ci;( D,a1Q)9)( Y J~:ae}-N<Ya:b^ЇeW4-uQF0b/Rŷ{'C7IZ@JbCac}J#U[4d:x2"Aan;--qO II .}a V2]W`k,4pބ2 ER8ЧOD,GDcD5 dHCu[AC!VZF낼AeՉ*k!Z|%$S1w1]Τu$9P0z2 aIh@))p"F3܏0g"nt뇩ozkAx Ya֦#^9Mx 3Ë 4 'oAx3^;}]r_Me7i;7DMtm6aM/梢&T̅ž `s-{x3N4\&"hc|u-PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!  !drs/slideLayouts/slideLayout1.xmlPKB PK!M[Content_Types].xml|N0 EHC-jaj; +,Kq:=ig ,?ϵYD&oDzCwO-gkcg$./XQ{jsԈHt䒦AFP0skfx(壓8?.C(ũ{R(Mb˳7{-IF#{_R'dK0FFjr'"&@_'PK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!Uy=!drs/slideLayouts/slideLayout1.xmlUN0}ҤiJ#ZDf Ƕlk];1hNڤ$sgU|'QNDip.iytg?\ :Ӡ6FQIM[OmjOuU E`E-nxcfdRn:E6P=<M*eX9HV} R;MVB0n As -׊Rw\nj*Qs`~pߨvvs hvOH9DI2K7bI|#: @ϋܲu;oòWU4x,ˤ-4,a" e: dxL<fO6;rsg$msBDuoio0KcVE2,I"$['h4]HomCB"q|z(!JM߉sy!SMuO^`t*sgy*wD϶l[U^s.]_[i WzPmxmBx_Odk3y, rT-,<Y7u%#5&{;_-U\ * KWqVJaZk5IߴK٫~oʾ.&y.h8 oW>˙Kh 6N7\Ԅ.ӈo{M)R`ߡI 6+ŲL}uldɻrXfZ1ϚCC!$›Go%c>F%3(SqEg{"Zw\i!6Ka 5!) EL"]7LNt wn Pi4uSX0N&i^g~^iEI̞W3.6Lĺ`kn-fƳ5na#}ҷ0J吗SM˨73 IҰP肝Cx#;>K`y#;`'a# Gvzf#8gɫ&4Li3\gy6>L?7K|) ls'PK-!M[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-! !drs/slideLayouts/slideLayout1.xmlPK Office Theme [S ;(     j0e0eTitle 1@  = Lorem ipsum  <   p0e0eSubtitle 2@   <  DTjDr}1cOr80___PPT10." :"r0  # Oh+'0P px  $ 0 <H' Lorem ipsumMicrosoft Office UserMicrosoft Office User2 Microsoft Macintosh PowerPoint@I,@ :"@Ѓ# ՜.+,D՜.+,   ( 0 ' Widescreen2 CalibriArialCalibri Light Office Theme Lorem ipsum  Fonts UsedTheme Slide TitlesP :B_PID_LINKBASE'ACurrent User_1_ Microsoft Office UserMicrosoft Office Usermsoffcrypto-tool-4.10.1/tests/inputs/rc4cryptoapi_password.ppt0000664000372000037200000012400013520721054025537 0ustar travistravis00000000000000ࡱ> Q   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNPRRoot EntrydO)є#OPowerPoint Document( 2SummaryInformation(DocumentSummaryInformation8l z-tE ׊+$ l >8H_1yZPvO{E/L[y璲4Y<'1;S91]Eڏ ğ.js}8{naXiX75KTZ7Hzh}8Kƀntaѧ۟Em@_s.#.O*1/iE!޺O#.II ,Q#:G),D'V9ʴ( ;ȂUb-^{ +>Zw o2P| lty{/M8Y$u.tL!Ẑ5 BOd֡ԓ[ӿsi*pX (ˌ\H?Df+4vj1BӪO &QP)xs# ΑտQjC!hC/Dp&S- SK,۰`޲4O!$_ͰB|C{B$*Hx3N&L˷^ΘI"9l9bϤh;^lNIҏod&J1$ pP `*m˷&k{+[h 6:v8^l{b%|rJ7EhT?L׷q~8}m;wSubg49(i.>mmpZЄ5_y%4s̕:9&d.&,6nWsU) ?&@|gZ~ !Je U>f\nxZWGNE"(i^}bHkla,@P<.ڐ6o]'`ł[+,2Pge%"7\w2MV401ɰnYĖ-c\b㓸ݘTp t\@J ]K'͖N +T|. 2{;I+ aWԌi vliQ .zԀ|Ĉ +?) "q#6%1q[gg7y h Bqr(PE].2+릌fU5 (d%`7Oi89H,Jσׁi)s~0)fj*+ '~(6`r͐ \l\ /]ԯG ϰMcL94c(HjEJx|;5}=(֧ك,2ċpz\.$J1M.aqzӳ"< e];OH%mˀsҗIMuiêhRQ;=2SISxu$3SӀoܪk"ɳ7@Bc}gļ|چQaG<)a8x[ k 褵Py6<ݲL{PpŖ;ꪁ3gU}뛱Ҽ?z8(":Xৌ&|\W ϐKb纙(u9)VY8&/RV } +6#5枻ZЊ.jm~X4totSI9ݳgAF'.4[Ƣ E8]1@VBacfKلzs-ͪD`Xq,EFf1D:?RF.hV  /d47v,7}ZS91$)RU6:q[9bgnfOut@GX[++ht_p=}0G&23ʐil|mwZ&ԢMѴ GǛVpOOpxdǚOihf> {| <I!Kn(>nY+Ǘ=ZO:2%[8 FU`# ~]F JNN>Hh4G]-]k@~;',b@~\B!&H{:Ceյ1#24)j ~SY|J(a3ړ@/GKyvXާÜܶ&KnSd}IFN(BM{PlWC(Xϐ >e"#m,51%&?+2+NWܐe䄁o"6q{Ovp f|qUey30 5W{i7DN-R =Hɺh^PVԺgp2ydJo, v,Q Ǧjl(WeY;kWǒ|Xm4N,'rFug#ZIu9Ið:2XT-bGsJ+b+eQ`F ѥډ[I <`i:`!^3qs!4 7cWc|SXD=&5v@"Dji(<@x 7/n#[~qZ︷ro:!@>9^'tŜK{ZMO5N[,&N"Ǹ wAZXkҤH9*y`zHw)+Ѓw65q{сS4cvC\/Zl"t]s%4:Z,) āpqXDOU m`Bj^U-kK*ʏLÇ_RpT>n2< UUvlbT۲[֪p|~#Isvȣ%1l\o=xYx7|P:L%sZђ٣qw vd轧rҒ=ԞUi;k'ᑐW lI `q_C@Aak1am}c8đx.Zt*~jc!>HhmiլOkHXFVG}mO<(*_ag! Ǚ,wƶ <^g4:mE %Twiy<Ōiit<GI^Ii!@r<:/=H+q;9+!}i.Z4;*^BH|OoaF۽xEwVV24ܡL2~M@uA1>nE }WE2kt_[H eTѷvsEnTK="0V'}H[8 AIl_v92՟@Sp|F=̝0Ϯy^3/)A%IgxV*E ~o?͐dAIW1!̳GKө{N3~ ~W  .|qBGMÁ:pxhU :CgtpzSH26@[{|{o?R|l9?\H`C54Ş D2AٗMd$aN~̖|<U3\N28gQ~Xy;^Bb g[qx ({MqD#0.;59O=X GX ))=L|$cK=u Y9#rfid8mKҧ 4 zԕae=~$Gg72R{|}m{wK?(7%^'\} X-’ݚhw:;wBg"ۑPdzA7S`@&) b2qt?I?>7v> 0V0Q mЭrx)ږ31 UE8"'@tl.sng}DMVٱX,imLpMUgQMnUR8z>! tMח8,b V;1 ]׎aBٳ|@'S XS]vҔpT6#i =.M> 4*~zu7XvbdBN\e͎RTzx#Lh5WP%&W"nI<&E5smhXz oN/OdKc ;.߫~VJ#ƐewTiYQO6te}-x'_'CJ%B:`F9k mv 昘^JV=s k\h¾X@W ]*Wu M"f8nh*,)#8cpj0i9sq?Jvl-"FW^:AjPQJ/@"`ZF)H80_ ?o9t7Ix@՞_7{b= ?up9# TP {4rMP,yYM`za_ p.}<2y]j;DZj;1kkHꝻ bgr\񫷼dHuA{^|^_ q/cYYPpV&}- A;Lvv hX"LvXCjN47OmINП17$(TRP)d馣V/*f4HO5eˎspq`x 1h' cQ_D=JW)'^TdD#݈VJt9yF_M3mwgPkAiCuޠQꧡ*L[ʄsރ:ȸa~-;sݩʱk󧢈',#(aϱ0GTZ (r(QJ㌘0 OD:ơހ [KVV7j9%p$Rc}X;7S.!'K^Z<_ZC8uU YTY߾pp}ڰ1 Nɤk h5f!{ pyk³O̴&.c=ES_\ `i4; 0&?BGo5.}_#uA% !:ܟZ&xa ]_Q(D-W[[#([lw{{e36~~e0ǖud Uq<,]*~Q;_ؖ[S!q5A쏈01x46?[y3}τ Onz ~yQZ,lyQż*/\ lf jEUE9q CJӅ} _? I!OI9o:Šw ?bZDLf|C4I94{1b]Ax|T&E2/!ʘ딜[{z&-G]N_:HSn3  ^w7u7iUG{Ay-buICOL@. n\ ,10=Wó}QA v" ]%b8JW.0צ~9:0l-/xkaGn#Ųn$ .mI/HA4 GvS 2x&SީLSz Ső$/{u/Wy-ܥxl2 iK&(.迕maԃXo[.7lHZ!"F(wRNß4/gXm ~q^}ޱk^[yHHMHA{iSK'sR>\AwU?q:]uBqVN*T m@=)gOM^wYN45s̥ZGE*%9*:+ٴ'f]>ͮK}nH}DUK9Q d<_}0`c%i.x- 39|N“cz0+X[ B*Z) Z Qa> QwxAua.IJbr8T7DY+KGp<+i-Ù y*>A$xR[dː8BGq_/IZeٍyc[a}YArx9Y>]It|\Z*xu{МZIhҠ1>#53 nI˞ & u0s 3jO.Q^81kV9gzܗ8c9&5b& %lN&6Y/,j4\Koϐ&(^@esM؅ =7)n3LN'%YR* c3v{;o-~DfL7A|[fN[<xah `]ɀw:U )gBlupTJH4ABvK& uuĜBMF5>~ܯEcHMpT6%c=K:ief^"a [&?PUM42Vr=Nܟ3hƨӵÅ,\4\3ȦNrR=ut㼳~c;g)6[WE?YHѧQfQ[PeI5yjoAhU@_3dzr?%DXQ"cmۅu`2j ΀ ͏-ߓ'5"z1sWҷ:͡VX1>iRG Ά~PxlEJ`/\AuMH}A#kӈإ N@˕FAy42@|!HHڠ &y,M-8RȀS Hv#Ad \83)^dN{?`pNQ ([" X-M%Fj+^H*qmuyrݣϳ΍[~bS&ށLhesV>}f 9OTs1 ;^ܿð۟/1ԛnpF=5r[Ol{͖<D,*O[&8L?< 8 :kTIEVD壉(˵M-J W.IytZv3͙G"fdJdjh@iIdM-/"åFURP/:=kZ`WHE%ƪ֭邫Q-G$a>#: "9 5"VHUvSBIZfaN%]+tQ^W[DZenc|WAά*nciB≼tF#⎡S@g₁ ؙ/]n$n)t0OOZV&UgiOSY$S{|(oF5&zy9 nf zr036WZ*RH8%K•+?zY:*jO#OFC;ͧHLQ.IA8TR xwP󒞷7-?yv9I_%jI-=XdPL_4DVB#v9!v>mb1h!v,q,q^CAuZKQ3RpHYH Խh9~+#.͢e8BXK Z}(@qtGųkm*Z*P n?CB$B8S; ;+dWBTv@U0zaCթ,=%;_ELo.whWA,t+j6˴nTim8 ̭Hs c@I@%m|F{7JFdF?,`3Da(n-1=5\yϥʊ C1B^H͹AM+/:0V{yNvHuO S^n!}R!܆ެ/w-ɹWp~ŢwBgU#F&%*6̬fͭ"+f/l8%D{gGh~[)NҐ.;g [7 hqpmc\=._}>yE-Fu OgiĆ,dM慊27i c ig}?(BR V;&rJ@pRA!+*wYi7tnuK.O)=O?/b>y୬Ū$ԼPyo: 􎌊WsQqcdGcL6t2bvb^s量EtoRPuL;EW-ܨ@^/(7[F v*!vk(W\Oo& Jމ^SqI "e1 u@="Rr*TgC,C C bPZ̦CrcO[8>{\l(tӪ|}*w^@GFAg\7q;0Z|_JGTair@|_.owҤSTn#H.xDz# sxۂgdU ֏dwdP_ DY&1˄[WБh yWLk(Iy8,F}, #]GHw+ɖ$\ 4HʠX.4dpƩʹ|қ0!Xq7ktA_ U*ğ0XȠ3m//.-y<<3+ؑ.'E7?)xRKe4CZycJ ۍmQȖ#lbxb_ӥ-"`)?*1z'0yy{]Hp 8#83QH.+Sܙ癧Xv8(FNIٵ ة<éRx&`>D.u>'Rq,D:_ 8_)}p! 3O]P\3eo ecO]H?՛L):4)UP$vϗg+EG`9dخ7`d*ak>k@Ja<-OYX8+$9˪BJBB{&n jGiYSq=[^t&"(cձQ&nd ]J )/relݱ0%HlȲ{Ce ]ﮬ*C`Z|]3vO2rY%#GPRC^<}={4A9~\3'㯅R+$(Td-o'1+(Ն}{Y+V=qhGW Ԍ݆rb]=[TRvfX\ 8s?0we˷I Aw#:L=F m'&OJ"mH-qJ Q\^Ҍڱ胭s(dx>lJ ,B'Ktď!8}~aԫTI[߄F8"}W: ڐ,>9Pުn< ou;75{M{ 1zxZ[QwVƈ |ݔ9]5 Z}fgi ]h'N"V'#o}%&&7n+;M D_sJos=7Yv7w. Pe_U+PÒI'cGJ;2 A⨖Uyws(tAXGݎB-c B"s2" USTӟеDVlMzFEYw56MYKY$ԀNѪךG+n,Rg q Q&gx($Ms i Y.s]\ X(J?1q;-H0,}vI!x`X R6--Hq cօ||LKts >.+?\g-^s&/;R;:B6?F9]>]9m|4 >졜K;2'IDTtGη.KWX#$H۹M̀EfLw"_k[J Nqs.\GkEms`sQH my)}Q^? ߿ kERZ*p; \Tё>`A(H"PB4䍦ufʖF/,Nw* `&KH.{ueWҬx7W /pflmR/TEhUHFl0b70iGyװ#ABSȋ(lyG*oYl8;͝X#(50|WDbGez {g w&P9.R[1ETFCd 'T;G,}0nOhfyz1Ao "w;햵ȭJd3?VbXdzz؁ΐly(d! e`mU.d8dL صhf@h0_ (#4,PX|=bp&Vz&1 UlAWk,4= Q>ʃ&r T^ezIWWARELGA(Q0Y=8$Zb k|Ξ;!oX9*4囪Du4M!#d eWL|A!)%!HA i61>F!!!놊i~vhFjEд-5cI-G17\زӗd ڱFdW⼯FУTrAUMH\n?+( CDH_BD t1+^ѩ]F6eI&FnI~zS;COJ`^1z5/JLRBoCi ؚ]f"8.BW eO`r++{ˉa"ݷ@ (6Amx>J$*! dxn")XrLFpH͡8M7]7qq'i&G*A{xׂՁ2@,oƸͳEL|o~SfXF r;Ti\]\=yaՄo8O2_38NEZi !M}TtHkv%&Teiːx51Юuuى X6%!lr7qO`#c5*SEMuZQEތ#mA`! On.%'v~ 4.D ,Z4B<;*Ϲd /~]-)ɻҁ`nnlMnlٴDDj ٮs-:lF:Rrrrr\DQh k $J xB,# =%g7G[r3oS=\(:Ǧbdp$a'DZr  1hݛ|![u*G)e' ͶT4\GsײZ5ՀKQKq5͍|)IJ@x-WG/U3$_}8(v=GZ fƎU^_ -d%YǪD,79kzT:`I6mk+g|)NQt0氾5/ژ۬km^FZGRO3<=mwKlM?uɰ{#H]"rJO>g:R~x3_XCt/5ffM+\Χ U&ab)=95|y[{M2b@-H-ŬXzo+H(xJN,gk˯@/&& o]$:!g{o?&#co"mqŠvۦ0uDxNC0F+:ojwc?8.+Un NRUL$d}[>KǢ=ohj1X(\x2 ƣ½*gcōp#<v&3o)#Ev`(`:Ar 0ǢWjR򗁽,̚S^Oq0+*?qh۠py:ᙶ3V5 I_i%.91KpO<}xPbNl/;k= ЎZ (òN[jӈ0ɺcV9vFID#ĺ0v$YvWb,Yݘ+؀z(pg5H7 6$.MbZKs,DV\?x]n< YMl?kw>5qGSŴf*D_ASx}[ޛS.M/Ih(jy!)Ū=݃O3r^]Q*,M]v}R.Ǎ"4Pp')@sVS}Xa}gmteחr =7 8$'K &:BEt=R-Bu]5OƲ* +|=YVb^FEd.&Ce-f],xOkm51?(" #XW%aI!B& 0c f,|!HEn,`?=&g{%AY|VkXRvSkkzfteH׮Dd #891ˤvL&=DoTmy*^GUwX@My6Ƭi޽•(zXP\nE i,$x•eKckr濟kOU>̦jz{ &2PGгQ7ika+ j/"fH<bfࢠl{y ̲#נŘ:3]fb8(uXJVp"$5jTK3Mz$?PfϸgC3xѼIYp|=͢Q]=$Wh k 16FD\6,XW@t|U]ςݕte"i{TzM0@2 2G -oFJ >*i@ :3>wD,i͖`zTC}fD+6@1o\=I"rT0W͹;i*Ңy8Υg KZ}~G% H) jɾWYĿ"e62|Tņ/ܽ'1 .!X[p(RCL3#fZE^NvNohEN:=+sq9\Z*>_#LNTou5r8E|7p`1toҏ:qKFOdJ)hݮoF1rs\ yJtTY6 BqiGus.;3oŁ;ܡo4&h78/@*Y=(e%\.qq}45} ?Ze`5ۺX8Kw|5s("8%C W9{ /K-Մ &x=U *n`|i:vb<' Gdrlz#I&{rB맰jn{7%~w5B8㯯\5z( &Zhi"z fYZ'B K!1C8%PF|zuFGP0zء}K)s `/:teO#đ*YcVw4RzBmC101k}'U(:}YgkCz\NRa(Ch"BUV8[s閜#0PH`t-dNAː`"L1PX6"aWGmCx3󶷖bDlB -c[lNif ߙ,z"ffaURG#V~S3݉C> $9.#i> 3N9 qБQ$+N (כ{!!nChoҗSJ='Zm"oϘ.RqK, òZe`\ )(NV.D^H}iY}2@0 (k#;,u'KS#JRQMz:Ta*lFqa7ή=D <'{$ P#* KvDiI4^"eE2d&gSKog&H諧@9?"< m-bOѵ%9˗,Sr85ـŘJc\м (t9Q^;rϵ5UIu!Le!ßLsh¡d)֛JGJWџS[bfȖo1k7= c' "J\3| r\Qak:& :pLprcs+_P8!ǖRr*Y[|L,S sy{Z -|Q r-cQN%I!%~JM\Qs^:v|G8Ž[~&:%v l?GslK;6JʉDe6/Ǘ KM9LŖ׀ݤt /ImZH3 Slܕ@q ~or/__[tf11~ΖCF9{}xO⮌I6>^ДLjM v>g ]aH:rذ'8$+sz&9Kg(6(*ì?D`@Up ֌D`2qU2@c3x!%h3:\UrҼg /%ni͐t gԥ .2u9UPSh`"Nmsi ]J{(r"2l>!,BwDvЯi o,L.ge jY_- m.᥹㮶G귡lj6,<sA ˬ\1bAOf)T]bX60*"|)YG:tv5R_mP횃}1 !b4$<1eȓpE<_$F>WפZ"!a ޮ6jZR!MM!A9ȷO},xhۛ!IoD+r LcKiU)S9 laviPz8m*,еP & O+:R,)/Hes t@e>)u,>;KBb&UIUьUTKޫi]`ddEJ4>R0rXru(#,E:r mW^*$QX;D?̀p|ɹt$JRH;kO4Eٮ*ԥY@1ѭ*x{pKH쪭*Y4g]/춫 ,ĺSqF,f9(aM-9JmPR԰*XȟR. }ĸ^+3^HH>;B+b& uwAb)ЖwT "FY_;A <~ĂCj; $ ? ^[۲BՒp۸t`KBhtDBsJ;į}B M,FvV4Mu|4%NVL δvs򡄓uhfe\R 1'H>q!p tE}5

Zz]Y?ENnEMis%gxݗLƬ*mky$8漼o<:̡DVz]x\ɰ)Xˏal5Sø5T+ T/bw$1ۊ=R v"c|mgF&-_ |m&_d!&&51`]bm ΢4Rv YpytWty7@87Q2JdI'_~e{ ]-EKBh!pvL^R&+x{>u(*AL{ 1X?ڝ4(4C*6}cϸXq%U])R*bܲ8JEe[h(i4z\}>d^xKJE^f"Y2厩 dj \}Kܩ'w_-b %y׶pcF '5*KAbBQJIvpZw@H1ƥblqZ;2ZĜ9']s~.k 4pZ*VmEuCߓ*;g:O#vm&R>eu֬><',CT=KoQ .3Y&yъ\aӊJa4 D5L9prA×IuGsqo hij)p9 Np{"Ǻ~"1ac^!-KuqJP-.61Hmik:|i-Ul&b {WͯҨ9ew`1=j e)-AXS=QL[ {LnYTIŃ V?8(yύN/Fv:ͧxZ8n6?d[KP{Z­AeDWp|1B_$#,!TfSa-$jB6g`< Bɑb+䅧KkiGXl{wdP4Z4s5p$N42>w sud, {ڬҨ@_ K=?'3DE)A]akp :_$ ^"b{Ȭ9r6 /ѬNѪ㨶)%mAmy_'LJLO'xjV/y=3mřZ 5ua 4AXcO flkʃۅ3"|KKG<ʳЛlD_R}.O"-as~#0NǣЊ, "m Q xmbsZ@5lI{Ni?vWmC!Z/wR`Ms!o`}jeo[bH-@)H(צP]'y+3bOyL|&Kܧvl*zGl nDJau_9¦#WѸ$u5n\]3ZL8 _k",,أs럚 M1G[`E.Yx5R,LfҋQd=n{7WICl[w)xa*gzs~tH}  @.@|j+fmWgiT ԁͻYf=`Z2\opY/ө[;{ֆ4!R,%F&f[LsЪ tF"8[]idRBn]氐va+A1aޛ+xxֈڃr*mj\׻2%r!*-tC%*??=dY.E6Dz& e ^#m\. ڥEzߴ'IM-lWe/KV齚/_ZIɗU{I *I"2 a '/̪כ"ߕai 5~*(Zۂ*YBxj,?Xh'e<%(ZFp_ d$}tB~cKij;;TQsE64ժ4o˲$ݓ4I55Q^`J[JnQb ;bZ_g!=o1xu´D;EQ"УDүwz֦>C)9 bSJX>I6⊃g 3!f~砣#vA0[aTk Y JHRZU 0Ϭ}Ƨi {M0@Z ɥLq5oc.<浣XR*00uOa+* s坴Xk\sUy qsE$ _>GEX#pvÛs3|05 sb֣C1X~"Ș9BD8hRL:hyn|*}Ryacw bg0:[][ULWpD&aS"@Uȫ–^`,>pu.X^^rc.{CkM)p,FɱxJ!y4I5+^'L5^ 2XOޤ:p)$/@ )4}m'ؘA.ڶ}4T{h1wVmG{Z5 e-Kɵx*uTHl_ƈ%G*{b\, zr 2p`пW4wjZݔ nTxv( ly]i>u⚚łŗb}eU2߰_eF; 6`?K֖#XX fDy%FXXDy6j7"m t""]*~YbJgS$uR-Y6Jv"ov<'<1קY_OCG1B_e'{j׋A0؊(22 a'/Fo :6ec+Hbz*b cZM Ik"yfWJ ^R|nXMbVo3լϜpc̟?Y[`ri7&rW7Q *ڄOˬzϳ*\ByqACh/ x"% j[ڋ،ou4PeFTҾ3]%+#NAqWZ"d3"^Br=|,) ;'h*n+fZ{CK LKvt o$puK^[.b-"(JRLPjEV節S\[;3yճɇϧ(ﳬܓEBÈŊ > TgTDXOý8WxlSoas&32iuʒ3 葏~ CKWxc#zJMIG' ] ׫`lgH"ǀPvI}mh7Wn O"sݪ ҋʚOiލێ1zxAzW=)| î]%DzAVQ[bN}ʏ叱)zgDc}|=T$+/|Vw_Q_v悭e{ӨhM7{aE:}seNHghoytOI<ݎ&o QU.ډKF[:ՆGn *>)iw'5w4ͼ PSd njCu#(k&[<FyrG|wU)kI)! &WƏ`mrD Hۊ+kƗc<6[م=E9 1@s9 VMI'-Wq$Zz!W2 j񞉹V)] EW,^Σޘ;2ͯgc2$D/>-kF:e ̎ q#qt)j#͟)HȔ}=YVO#n>) >P̨ˈuف&F'JiP6]*o/oO H $z!qORHv)R dK"Y' ɝ*#ՠhCN"#ȡ$xe6bΧ~[\+e]*['~ZCpSΫz̭)A4B$Y8 (J$jez3H;pԬgjTܲ[;u!OƜj+SMmi,VF&#kIrJմbP9fa75=+dt߆76zF?M_<5y1Dub)DP ѷ#^ft5½@Vϯ:iYqjŇrV wX`h (1+25f;) ~/*?U/Ob~eXIeY<+{! $|OPXy<YV/*ga`4"Ra5QM'R'R*{T 23,7wa>R3aԒU LJP*k ?P iKo3Pyk!v1 @G )~y+727x: zEP E H_fo/{G+LsKxĉޕtFLc<S w@DHt>fau 㒕6s/M:7xӓqYxxg&O+%* ͼ#/>i%{7#ӵJ~L q 7Hlkf-!?mK΁N 8@V, A$*QX9ba|ZdI&2Mgt>c., "O11j?5oA7LwRY+/h?vラ(etN-gʏMNT"Αp[-bz8!/Q NuvsEK>mUʨ %z`jѣRn\ IQ~!횘YZ9:C /lBψ~qaU\4@ˏ6+Pq.MOС`w2=:p!;jb|h9X -d!(p .IԕHlVpSUtB~DO4`1cpe>/Q>OR02vKr: ^ZT Ӿw›Wa{Ȫ0/*z#S!G3S=wyR 1M+gSpWL=  -t^pY[MEV׷sяD=F6',\P@RYU4Eл}q~/Ky'xJCJ&64HB`)=r';9A1QL[)V}+11q\KLg޷`?TSݩ44Ө tn|e-6g':Gړ5g*lf]`n]o:\Ą&%*O;F`փ ^0^4e8νzg+^ۄ'/H :goèoku)͓%I!$>1k,\#aH&ht Nq4Ϧ/556qIg5 Q!1k/[+8I`fc@ixRyFxk!\( `{:Q7Q_Tz dAV2:sc1̴W#x>b,Ř?d͝,Vf#[Mw0ճACߘRtc-@),٘r~uv_ijd,JkS<'YN+iJ/SldP!8ɧAh IB`H¤ [/(R6Zz]GXkUMnp`RM}_4|JD˟,!ߠaEs:$2Ϭ "IDeVaxڬK_x,F `CDc.PK473[&ӭ)MSʜ|D&Шѥ3^+:lc4V2yAkcVVTN|@S)Aj^XӄS:d7Gh$P6 P#G}V2X8C60vu- fh/ [fMrWY' nլj\CpDchNS8wJU%bSK h/V:}Q?] ȎۈF]{Ў!:K@REP&ub/_XSoZ}k#a8LXڒCNXu޶6:Gt90MhIiE'*]aM+Fz+l}`3 ܒ,>K|~d x?ݹ64/I*x- g{ ɉ#w}l 4t4?F-(bGC%I5>8 f<wݲ `O!)S-bSƏW v#Yԯ.?*}BWp)dG|U6ޯ.},N~- 1 *+.8 ?/hk wL|P*`t3jGd(bgcX&QD^CXz cӣB.蜜Ěn>4@m_L ITRCflit:*l-d~̐}eL %L G{N9p`˜aV~͖0ͅcv ^{6`bTl`}Zζt!pcxaM ;HЧ=3D䷻-wJih@ FpX@nru;P'1pU'՟ZŸ ԡO &>KNژ8!NMP:OdD"QmAqd]G$F_jҋS[ѤJ^BhI9ϦW lωe>g(E"ζh q6 I8HpO  [A'yM$$X}1PtnV1jWYݑFҢC T6x!xwmNw /ڨB+^qVgN{icxV0'[Hx3tEsG͈y((,$n9}:) iy;Fȧko7Io ZnvPWU~ЎrE|&f"cÃ{ԭ64lU㤍g%}U0SɅaxAɚ9ngVVQ^լKi. 1qzc &FWgGИ̝N\~ͮ-JS[&e_wI!m퇥ɶ97@?x'P!Q*Uh6쓓:lv1@ӣ`'[>K֛07|B<Gv.tV4w)zzF#y P Fn :}>pP ,G5Tզ%) (wx2n E`9|^nQ Y}g)Pu$'˴$M ?N7.n+ ?yJMFO]sadG_|acP :`6#\Wyi﬉Bky?oU,pKK+ݑd`T g.CM[4֎DID5 *:䮚 I?C * 6^NI{_r/ byZnhsg|D#Wץ 7n{h3% ~ G_{t o'h٩8ڏz 0xgt<`4ԶЇ[9ـ$(]_) Az|Xgd`96ɒTSF)ypauȟG~ݪ;qYPS\L7=F>\k+Ո;]Ai]6p6?o*cA+35cyS3#C'uTKMD26=)m R(e;vlC8k~^ױ$7<|h *(پy7 9 [0о :׿ORn6Xwj~qwBȪ= KPZb^}CXL r T7: \Ll=3UA=bjkI28!mLdW|b9,aIy`'.bAfƩEh9xMY1 ;X'6+T%J2*ː,m  (oP 㪍:<06BEh\œځ[!X{9Ώ5nlh_lPSLL XS^OSz@tڡi5z|o&411%N5~K:w~S[aq$Q/2afV:Gh<xp낼P [ M44kL2+񿪫.A{RAr@MDeO-%dfq;8)E llS.C Ny4#9~[oA]T|;8+@TjZd|$O{bMAm-# _I -J!XI xA:@Qr0f1s0s}j8yo 3w`:h_Zx͗ )^^1a~w%>mj@t,uœ66^ݭ];י%jdrV3N^0U*A MLʕٹ{nggÇ7Ε! 8KB2V#qkʏhcv!Ab;Fr~Mt?eIp2.k'ϐѱX*JL3Ec5>ECzf9Wi-vrNJxGFsN8iG~$ɤ07sJ[](ߪ#",_8?& t|EDϺڗ,&Q,1RT+\p K\m+ӇyP:£RDuxswdw4kBwzs5j!3zi)u?ŏ/!=D IJw yx77ҟLHbe/@0ZOwdIS;ɹyx.|(YީR  /CV<\021B:pY bsP_PưMO8hH^=}r\238 qi)Lt*sg]"Ledl6QB "K 㓻ri*xPf-uc1jFVenIF:K  $5:?uEt)ԪwZJ "cI{p;HfCsl65>&X]Vǡ{{y#Yfs#Hׄ2S5G9_yt rT.y2h~+J1 .v^:$/ g}I% IFS _v%Xy;kP#2$kFͷ´џリLv_KF4~|ޟH~W`!9WD͠ӳ'yIWەr<'E>碬hf-2ݛԲ&#{% ٶ%YyLULIfل}re,* ճQ~$'I>iWzL/:}:ۄC  _r ~6\a4œ5=]CpiĚ0Dz8Q$ÿ >#hżQX5WtLy0&`N R'H+Rn3qBjkk> (*'   bjbj 4e"tUL=p`ai= (Mz kdr3oCg;KY^+4 ;9*JA9p tK7o_1Z*jXX|?͉KkC'w߮;_,P֋aPCjVѪI¤ط4_oLW@۝ .6~1HP'OX!y-"9Gcʓ&csPPUْڼźʰlJA`:cw\o_ =[1nϥ& Tv[ڇzۘikI1h/7P(7cºpkE 1~^o:zfZhc| ,Q@]6S%g/{ZH`F#u?س+FQzlfFpH`aiv]gj^{y$\kÌAO>8/iUW+ɢ['9 1&=7i{o@t zE=4dI4~Z)^떦iHDy׀|ƐѬ; "_[ItvmQh/}l9DPoޙl6hr[g";'˼6,ig:ON8{{+#I?TP=1%閞v,i]|[ROH]P`{U:i64I)RzY\r[5+B S+(ywbk 9B𾦹h#}VW$,DDm}HA6tFRj&MYU:G1IjŎ vS8"5/)s6a{TY~V"FpG)=@-FǧTѹ:4+Jnޥ |-lTdi;gW2 #_|%l9v]L(x/S}lw@Ttޯ5ᒲVKd$"0kƀ=K7S[vYֲjÆ C̈́L$R%6Ȯb|]vWGk-l!;Q+30}sƚ_1>!|E}chÉJfhX 76D~Uн@|FslΧ+ϑ3za9^L=2Jd̴c%y٣k5po6"LM^rчty1V$~Q\0C mjwh4ǻݖM%A,h`"`u+ˮJDD鰆d9[#SD5NǛ3xܠτHMyC7ZJ]WjF$"@3$3@&oY'L]<\Ťxz$h"9k!<{ۉ}ސ˛p+ V<å'mK)wb"_W˅|𱖲`nP*4ҤPьyzp*3"QzP<[n4hHkdRuS-#DӀO\9ꤣ}ņP}P\߁qhX 8r}<γ3: feeD4lӘ;WC&saya7?i 듯['njPosL92H.YsHI% ci79=^&p-H1'^NϺE.b޳&0Ĩۙ?OuwMlNHZ*6(rƋ v\p19Ӷ$\fRW65aM 2T/$ÿM ]4(+yyCtH_e]joPWc͝P17"PQhA`Y9s=#4b"D_WW$r1_R/?,a3ѣXNsu`e (,TW32/ -EU~# 3aZRO6p!ݴS +gG=c"wͨcRFH{)0kFX]_wG0>;&3B=rO 4 @cɔoM ReaE필yIz6C&20`2tc#($3 5 7RG2T>^,+y:~vq1 ߁1]|j@&S-j_dWm5iMRYFz'iW\a\^/gl3ʜCǫ yeyxQpݣdwyW湝ˍkd)٘y{ZH q+04H8'_0 CՁ1 +i,rfGpK9ݮ-F2+?w&;mB޿ ؝lM6r<ܲI%~6˜^ k;,9o <P.s )7y7"08Ψ/_EW+K)7& 1i{Y@0|E;4d42~Z/)h렠iHBy׀|0窴;"_[Ir@P}QhKZ9Poؙlnt[g$;!6og:"OƴN>{M+#9RP=1%35p,i_y6TOh-.IQ^P;K5}U:_2p4I-R,]\r5]+B Sݾ(yvƍ9Fh⮶}Va 84E$(D }>/SA6tGFQn&MOU>GIj̓g }S8-/)6Hbǫ{T KzV"FtG =@t-DգէTDҹ|/4](Jݥ x-zTBm cW2m#_l'9H*O=x/2A'y:s@"p) 5'VK~g$!0:F@bQ\*d_kgxFEX)vkcǢBDQy260=҆riDv#Q۔h>q,[0j:_K_PԾn ʉiWƃ6´I3aZzxmgn>կ9cNĘYnHm摥iz&ip-f7syi/{(.m?˳j>__:Z3*8;GN,*UTd *:Xi"})RB.Yv"Z#٦p ĹLK#0hzRhX&>uaօo2Ĭv“e'f2Ե6IP]Y|~oE"3Lj~wg/.2DHj#֌q }PD^eڎw1cV8vSXP *icĕ1ٻ,2Aiz$ޞ;]|ބ=5AQU |ɇ> ڋnnA̾pRv5˲8 &A[ޏ'@,eREv d>7S[vYֲj1y3 OL2RC6<]ѳvwGCl!iQ{'J?=}sƪYP>!E{}c&J9e7*DDJaSмJ*sX+ʒ3Ac9^Lg͋dc%y٣l\ZJoE"8M,p②v΀T$~w?(UڇsiKDӅ\zDLj, `I lPdvy B G#ɦH\ mh`!CY~j4:fj[`[=-׺wC' ZA;ǐCuJK{*sY eAǏ[g t'./aLZ.cgf>z]Ñ#7i9qtY}q {Y֎Ȃ]1(ǒzl|ffP*wr hfьy%閧Of7Jw9_s}So2RKfv-0Jx{u Ng.Gb4ٛEõnUTگ[|w16c[AYB{@; {E).K ^8OTj 8ܞ=\b0n'. ޾i=ې<^&spfK5'VNϺd. HƬ0ĨۙvR*bk+%tf=OD ;=1? LF F:Rݤ,RVN7Nwk (12Xd9!H*-rHaX@lEiⲡ1zj]$%N2\<Ri@fYrg=#4QҺל_W2Tep&BaKDV #Ο,|Ԭz'NU?ݾz"gVJ^fZI.+C$G6Vcڲ-)/,pԣSCGo j"}wV׳?2΀ C2K{6ws6!RjKrb/Ҳ_] 0P${4_S\ @߽/{OTX/1\q9 7wKLǒ+4> oCCmA}cLOL,xS|`'4j);lDqDqh#Oq+*/):; ]#Q_Ɗ_ɪF12^OYgջEHRɩ_r{ik8NAEM?43D2#z/WF@,`ć #3zzq,[+S5?8 ^I ss@|6n fWXC-馿;Dp꾴UtI޲pW0<#"W?he.tfDq Uf GGrtl;IÔZR18Jyc @؂,v8P\bLVWs燬NI#;? ?&ϧG塃;A5 0=%9%Ie|CB2V:H) [A h>uHM貘a4k\S \,p&~(JT ՖbsM˛Y%zN>; ѩHM#;?4eTpZn )Db :K;!Q `^!zBk-gsB>\MҖs<ޘ^0gՄg$eB(J 5O/1JDC "á v `ǧv&P,5}M9c#0qkC;L2LYtLaf`v#'xN2au()O0xCrmfO%}m x#+@AlG rAsin2'(XPxH=qIquڠ'@Nmc2acYlAq,mCv]Y-x4CzTnHs>B vO@/.#Krwk0BeEO/@_4Dj8?l?O^ SzAJ~Lwp;Yf+̋Q97hGz3Gj|D1(o ( ,d7b/$ٮ -Cg ^hR7=k.'"]:b[l/VN-1i% K*NɈ5-4r(0'ÆHT\#&{ٕPR*LfE{WCwB_4\;Z?Kx~odo QtU-w J:Kk&Hƭ9b*p =X\jd鰻kkFت }R@M1^}DscxR n-#ȳb"ߠJ֌xV?ΰ?֠ЂEc0e [H<]6-̋jyJƼȎ!eEk&3e[%hb,gk⇿L A UcvnoL%~ $k^$MJg`= <[یDi]cn%8Bg!ufu? Ԡ,y»U4tszyvej9/Ĵ⨁0 kKS_\ Oۗ4#5ޫϕҌ[=82%0@R8RA +5}֕k\K4COSt1S*#}o]o8;šm߄P7v< b8U@"芵fF߀N(XDtXJ(gЇR5]B[ȱ#'69:{kFaQT2Za yL=vc| 'zgĔ^qU;}E[ŷF#Θ z]===Z&!v-l.-+])={|ޓ閵Ս%r2L ֤2B5EiLaMOn!Ķ8ӂFIk?J06FS2_6ra;Ou$À>E[~("V dG.dtI <AW,A3'ۧ{/qRielCGmZrQqL# ok=\zXO9ǩOlhuf+o63jh}>IQd$BˆP_k|_v'[A7R@YR6p"KIS Ǝ/:7I{N[g_AT.#p6I"ƶ`L\}w6l.G=M1x tl(LwbHR\ S,7ΑJ^ƺVW]0I:9Ns\+@FeB!Rԫa A=}j1䒻ݚ{L?׮MP hzS4MgRbeQl>N~Kv 2ߦ <] .A;ͺl剻eڿA#K.w:S.1KnJ ,7 :~oMjsx@}XdA'Jm;7ł7ꟼTFTAr@ hZic">uW5Ѽgq2eǜR4uE 2@f#4i'Q)sѸ iq }]&HO_Uѧ?Vӏ ݡGc7Uߤr Oh+'0d   , 8DLT\' Normal.dotm1Microsoft Office Word@@:m<{4@{4  ՜.+,0 `hpx  '   Title  !"#$%&)Root Entry F0{4+1TableNWordDocumentSummaryInformation(DocumentSummaryInformation8CompObjr  F Microsoft Word 97-2003 Document MSWordDocWord.Document.89qmsoffcrypto-tool-4.10.1/tests/inputs/ecma376standard_password.docx0000664000372000037200000001600013520721054026134 0ustar travistravis00000000000000ࡱ;   Root Entry  !"#$%&'()*+,-./0123456789:;<=>?@A$$fMicrosoft Enhanced RSA and AES Cryptographic ProviderfI [+C0Qos.o6(+ahھ)+|Ft\@No=#rjcJx2̳g>Dw!yAN[B,9퍋;Fyς찊\w RR FW~A+PTVNiY@_ YL>L,E>zc52Qn7H>l=44ҹ+g'{fFK4j-"XdQM*nvYi~\gAKȸ8Y|s3rjk%s@K_,9:ʢW9f F:ˀ\ڳlɃq b+Ҩl)Xd"8 ./:Te2Xߠ9U 鮨Y듆bV`; upi&}m ( m֯}HS\ 64PN:TfT q3k.TPdUf-7,њ˨<$NӇ%؅7xNv!w`k3cul&Mn!±o~wL,~V ;'Ylv뵃~;[V`Xwi"W7WxBTMaa}).n`ur2 HGp_'M\+44GR9S#`6fUϡY{CGcލpWridO̸VD*\ AR9+̀D*joK/cvcVNr$"S9(ۨgIkN.__}.ٺUhCp|۸p/VE7Wc#l_ᓣ!yAor@>1ҧȎfMtXሶ4\P?쥚B yHM ժKUsg7Z& ˋrg{jTd 88H~J+3 *`[սk8S7-aƩb`*Ǽ[LI,ZR0CJ*ϕ4nR}nL,ݧ| b5QWĜyjjdhPGa}LO+mA'[8S43fH/*^IXOm9UY½?jybXNk":勓fNS'E{[=# ŚcCZDf&ty0%!ơķDiW*_2>kXNɹ챓Kw2v};-T9:iSF4+?+fi%g ' ۿ44~;O"@8SUmУ :1f*@-QM4]=ېixw\MM671= In9[{Vzºb١RınSeCVT)_J!KfIbE,:i;wC'ug@AGp\tm;eg Q [xc̀57_orWSk+ S PIx=nqi^"װlweXn{ xQVV+{\ВjŧFI6lvg2 je[,(@5@M!sp @]7ewLyE%zY28:MhpRʹӠ¤C2V+ < J^ͰA@<;-L AՕ*:7;?* 1EoY Obku314t' 4tOl^Ҍ>Lȑ5j5 ޭS[) 3G-:g BtJ~0SДn+0dy@".:q[2-L7Pdiсr_:T!`kXo3tkP-f}|0x6Py\623~<, .$"Rw٭dbu2" Ua jN=gibGBF"Eib>2:ʎ}*ubږ+4we* !TԝU~L0|S a-:)e >m{X^:\z)eeKe &ފR~waAzP4钻MƱ x{P@F\ajRKd)K|Khzc0n7zՂ]l:ȓ}-GotzYM`Qcﮅ?#b+xT+oNN>f3mCCNCe@VE-֎> 6j' v`g8]ozpI$=s[o^Uve۾BЇ`˼@;!Z~"N[N l]"W 뮷~REl8Wm&v[#"WrW]j/ :ţZU70Bk."遹 tHW8w~-a2}V36qe4Y76b1>OsOSԄXCwۥRM-̠V*J6 3dܓޡtZ / %dQΝo 1ynHHF#: lS%/sDv T]f`?gG9Y9X<'Dp(o> G<_(ܡCB(\&AJy,?P `VgǕ>74NCDa{etOR+ҬV[~L/JIЛ22&%(=/홤p+`jI /?,|r$^ٟxYyC3ZLb_AԚ= ?8庩+[sK5` ;tW $1Z`%,,!Root EntryEncryptionInfoEncryptedPackage"xmsoffcrypto-tool-4.10.1/tests/test_compare_known_output.py0000664000372000037200000000644413520721054025031 0ustar travistravis00000000000000#!/usr/bin/env python """Compare output of msoffcrypto-tool for a few input files.""" import sys import unittest import os from os.path import dirname, abspath, isfile, join as pjoin from tempfile import mkstemp from difflib import SequenceMatcher try: import cryptography except ImportError: cryptography = None # add base dir to path so we always import local msoffcrypto TEST_BASE_DIR = dirname(abspath(__file__)) MODULE_BASE_DIR = dirname(TEST_BASE_DIR) if sys.path[0] != MODULE_BASE_DIR: sys.path.insert(0, MODULE_BASE_DIR) import msoffcrypto #: encryption password for files tested here PASSWORD = 'Password1234_' #: input dir INPUT_DIR = 'inputs' #: pairs of input/output files EXAMPLE_FILES = ( ('example_password.docx', 'example.docx'), ('example_password.xlsx', 'example.xlsx'), ('ecma376standard_password.docx', 'ecma376standard_password_plain.docx'), ('rc4cryptoapi_password.doc', 'rc4cryptoapi_password_plain.doc'), ('rc4cryptoapi_password.xls', 'rc4cryptoapi_password_plain.xls'), ('rc4cryptoapi_password.ppt', 'rc4cryptoapi_password_plain.ppt'), ) #: output dir: OUTPUT_DIR = 'outputs' @unittest.skipIf(cryptography is None, 'Cryptography module not installed for python{}.{}' .format(sys.version_info.major, sys.version_info.minor)) class KnownOutputCompare(unittest.TestCase): """See module doc.""" def test_known_output(self): """See module doc.""" for in_name, out_name in EXAMPLE_FILES: input_path = pjoin(TEST_BASE_DIR, INPUT_DIR, in_name) expect_path = pjoin(TEST_BASE_DIR, OUTPUT_DIR, out_name) # now run the relevant parts of __main__.main: with open(input_path, 'rb') as input_handle: file = msoffcrypto.OfficeFile(input_handle) file.load_key(password=PASSWORD) out_desc = None out_path = None output = [] try: # create temp file for output of decryption function out_desc, out_path = mkstemp(prefix='msoffcrypto-test-', suffix='.txt', text=True) with os.fdopen(out_desc, 'wb') as out_handle: out_desc = None # out_handle now owns this # run decryption, capture output print('decrypting {}'.format(in_name)) file.decrypt(out_handle) # read extracted output file into memory with open(expect_path, 'rb') as reader: output = reader.read() finally: # ensure we do not leak temp files. Always close & remove if out_desc: os.close(out_desc) if out_path and isfile(out_path): os.unlink(out_path) # read output file into memory with open(expect_path, 'rb') as reader: expect = reader.read() # compare: print('comparing output to {}'.format(out_name)) similarity = SequenceMatcher(None, expect, output).ratio() self.assertGreater(similarity, 0.99) if __name__ == '__main__': unittest.main() msoffcrypto-tool-4.10.1/tests/__init__.py0000664000372000037200000000000013520721054021225 0ustar travistravis00000000000000msoffcrypto-tool-4.10.1/tests/test_file_handle.py0000664000372000037200000000230613520721054022772 0ustar travistravis00000000000000"""Check that given file handles are not closed.""" import unittest from os.path import join, dirname from msoffcrypto import OfficeFile #: directory with input DATA_DIR = join(dirname(__file__), 'inputs') class FileHandleTest(unittest.TestCase): """See module doc.""" def test_file_handle_open(self): """Check that file handles are open after is_encrypted().""" for suffix in 'doc', 'ppt', 'xls': path = join(DATA_DIR, 'plain.' + suffix) with open(path, 'rb') as file_handle: ofile = OfficeFile(file_handle) # do something with ofile self.assertEqual(ofile.is_encrypted(), False) # check that file handle is still open self.assertFalse(file_handle.closed) # destroy OfficeFile, calls destructor del ofile # check that file handle is still open self.assertFalse(file_handle.closed) # just for completeness: # check that file handle is now closed self.assertTrue(file_handle.closed) # if someone calls this as script, run unittests if __name__ == '__main__': unittest.main()