|i ddlZddlZddlZddlmZddlmZddlmZddl m Z  ddl m Z n#e $r ddlm Z YnwxYwejeZeejdZGdd ZdS) N)md5)pack)default_backend)Cipher)ARC4ch|d}t|}|dd}||zdz}t|}|dd}td|}t||z}|dd} | S)a( Return a intermediate key. >>> 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 zUTF-16LENz>> 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 rNmodebackend) rrrr decryptorupdaterr loggingdebug) r rencryptedVerifierencryptedVerifierHashrrcipherr$verifier verfiferHashhashs rverifypwzDocumentRC4.verifypw1sxu--S o6G6GHHH$$&& ##$566 ''(=>> 8}}##%% |T*+++|##rctj}d}t|||}tt t j|j|dD]\}}tt|dt} | } | || z} || |dz }t|||}|d|S)z( Return decrypted data. rrNr!)ioBytesIOr enumerateiter functoolspartialreadrrrr$r%finalizewriteseek) r ribuf blocksizeobufrrcbufr*r$decs rdecryptzDocumentRC4.decryptHs z||xu--Y%6ty)%L%Lc R RSS 2 2FAsDIID/:K:KLLLF((**I""3'')*<*<*>*>>C JJsOOO QJE8T511CC !  rN)r/)__name__ __module__ __qualname__r staticmethodr.rBrrrrr-s^   $$\$,\rr)r6r2r&hashlibrstructrcryptography.hazmat.backendsr&cryptography.hazmat.primitives.ciphersr/cryptography.hazmat.decrepit.ciphers.algorithmsr ImportError1cryptography.hazmat.primitives.ciphers.algorithms getLoggerrClogger addHandler NullHandlerrrrrrrRs5 888888999999GEDDDDDDGGGFFFFFFFFG  8 $ $%'%''(((04444444444s - ;;