o geA@sddlZddlmZddlmZmZmZmZddlm Z ddl m Z ddl m Z mZmZddlmZGdd d ejZGd d d ejZGd d d eZdS)N)utils)AlreadyFinalized InvalidKeyUnsupportedAlgorithm_Reasons) _get_backend) HMACBackend) constant_timehasheshmac)KeyDerivationFunctionc@seZdZdZdS)ModectrN)__name__ __module__ __qualname__ CounterModerrJ/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/kdf/kbkdf.pyr sr c@seZdZdZdZdS)CounterLocation before_fixed after_fixedN)rrr BeforeFixed AfterFixedrrrrrsrc@seZdZ ddejdedededejede deje d eje d eje fd d Z d ede fddZ de de fddZde fddZde de ddfddZdS) KBKDFHMACN algorithmmodelengthrlenllenlocationlabelcontextfixedc CsFt| } t| tstdtjt|tjstdtj| |s&tdtjt|t s/t dt|t s8t d|s<|rB| rBt d|dusK||sOt d|dur[| dur[t d|durht|tsht d |durnd }|durtd }td |td |||_||_||_||_||_||_||_||_| |_d |_| |_dS)Nz.Backend object does not implement HMACBackend.z5Algorithm supplied is not a supported hash algorithm.z5Algorithm supplied is not a supported hmac algorithm.zmode must be of type Modez(location must be of type CounterLocationz9When supplying fixed data, label and context are ignored.zrlen must be between 1 and 4zPlease specify an llenzllen must be an integerr!r"F)r isinstancerrrBACKEND_MISSING_INTERFACEr HashAlgorithmUNSUPPORTED_HASHhmac_supportedr TypeErrorr ValueError_valid_byte_lengthintr _check_bytes _algorithm_mode_length_rlen_llen _location_label_context_backend_used _fixed_data) selfrrrrrr r!r"r#backendrrr__init__s^         zKBKDFHMAC.__init__valuereturncCsBt|ts tdtd|}dt|krdksdSdSdS)Nzvalue must be of type intFT)r%r-r*r int_to_byteslen)r:r= value_binrrrr,gs  zKBKDFHMAC._valid_byte_length key_materialcCs|jrttd|d|_|j |jj }dg}td|j}|t dt |ddkr2t dt d|dD]7}t j||j|jd}t||j}|jtjkrW|||||jtjkri||||q9d|d|jS) NrDTr$r?zThere are too many iterations.)r;)r8rr_check_bytesliker1r/ digest_sizerAr2powrBr+ranger HMACr7r4rrupdate_generate_fixed_inputrappendfinalizejoin)r:rDroundsoutputr_binihcounterrrrderiveps&     zKBKDFHMAC.derivecCsB|jr t|jtr |jSt|jd|j}d|jd|j |gS)NrFr$) r9r%bytesrrAr1r3rPr5r6)r:l_valrrrrMszKBKDFHMAC._generate_fixed_input expected_keycCst|||s tdSN)r bytes_eqrWr)r:rDr[rrrverifyszKBKDFHMAC.verifyr\)rrrr r'r r-typingOptionalrrYr<boolr,rWrMr^rrrrrs2   H $r)r_ cryptographyrcryptography.exceptionsrrrrcryptography.hazmat.backendsr'cryptography.hazmat.backends.interfacesrcryptography.hazmat.primitivesr r r "cryptography.hazmat.primitives.kdfr Enumr rrrrrrs