3 lá˜_ÿã@sÔddlmZmZmZddlZddlmZddlmZm Z m Z m Z ddl m Z ddlmZddlmZddlmZmZmZdd lmZd d „Zd d „Zdd„ZejeƒGdd„deƒƒZejeƒGdd„deƒƒZdS)é)Úabsolute_importÚdivisionÚprint_functionN)Úutils)ÚAlreadyFinalizedÚ InvalidKeyÚUnsupportedAlgorithmÚ_Reasons)Ú _get_backend)Ú HMACBackend)Ú HashBackend)Ú constant_timeÚhashesÚhmac)ÚKeyDerivationFunctioncCs tjd|ƒS)Nz>I)ÚstructÚpack)Ún©rú!/usr/lib64/python3.6/concatkdf.pyÚ _int_to_u32besrcCs8|jd}||kr tdj|ƒƒ‚|dk r4tjd|ƒdS)Néé éz(Can not derive keys larger than {} bits.Ú otherinfollÿÿ)Z digest_sizeÚ ValueErrorÚformatrÚ _check_bytes)Ú algorithmÚlengthrZ max_lengthrrrÚ_common_args_checkss   r cCsˆtjd|ƒdg}d}d}xZ||krt|ƒ}|jt|ƒƒ|j|ƒ|j|ƒ|j|jƒƒ|t|dƒ7}|d7}qWdj|ƒd|…S)NÚ key_materialórréÿÿÿÿ)rZ_check_byteslikeÚupdaterÚappendÚfinalizeÚlenÚjoin)r!rZauxfnrÚoutputZoutlenZcounterÚhrrrÚ_concatkdf_derive%s     r+c@s.eZdZd dd„Zdd„Zdd„Zdd „ZdS) Ú ConcatKDFHashNcCs\t|ƒ}t|||ƒ||_||_||_|jdkr6d|_t|tƒsLtdtj ƒ‚||_ d|_ dS)Nr"z.Backend object does not implement HashBackend.F) r r Ú _algorithmÚ_lengthÚ _otherinfoÚ isinstancer rr ÚBACKEND_MISSING_INTERFACEÚ_backendÚ_used)ÚselfrrrÚbackendrrrÚ__init__9s   zConcatKDFHash.__init__cCstj|j|jƒS)N)rZHashr-r2)r4rrrÚ_hashKszConcatKDFHash._hashcCs$|jr t‚d|_t||j|j|jƒS)NT)r3rr+r.r7r/)r4r!rrrÚderiveNs zConcatKDFHash.derivecCstj|j|ƒ|ƒst‚dS)N)r Úbytes_eqr8r)r4r!Ú expected_keyrrrÚverifyVszConcatKDFHash.verify)N)Ú__name__Ú __module__Ú __qualname__r6r7r8r;rrrrr,7s r,c@s.eZdZd dd„Zdd„Zdd„Zdd „ZdS) Ú ConcatKDFHMACNcCs‚t|ƒ}t|||ƒ||_||_||_|jdkr6d|_|dkrJd|j}n tjd|ƒ||_t |t ƒsrt dt j ƒ‚||_d|_dS)Nr"óÚsaltz.Backend object does not implement HMACBackend.F)r r r-r.r/Z block_sizerrÚ_saltr0r rr r1r2r3)r4rrrArr5rrrr6]s"     zConcatKDFHMAC.__init__cCstj|j|j|jƒS)N)rZHMACrBr-r2)r4rrrÚ_hmacvszConcatKDFHMAC._hmaccCs$|jr t‚d|_t||j|j|jƒS)NT)r3rr+r.rCr/)r4r!rrrr8ys zConcatKDFHMAC.derivecCstj|j|ƒ|ƒst‚dS)N)r r9r8r)r4r!r:rrrr;�szConcatKDFHMAC.verify)N)r<r=r>r6rCr8r;rrrrr?[s r?)Z __future__rrrrZ cryptographyrZcryptography.exceptionsrrrr Zcryptography.hazmat.backendsr Z'cryptography.hazmat.backends.interfacesr r Zcryptography.hazmat.primitivesr rrZ"cryptography.hazmat.primitives.kdfrrr r+Zregister_interfaceÚobjectr,r?rrrrÚs      #