a oe$@sddlmZddlZddlmZddlmZmZmZm Z ddl m Z m Z m Z mZmZddlmZGdddejZGd d d ejZGd d d ZGd ddeZGdddeZdS)) annotationsN)utils)AlreadyFinalized InvalidKeyUnsupportedAlgorithm_Reasons)cipherscmac constant_timehasheshmac)KeyDerivationFunctionc@seZdZdZdS)ModeZctrN)__name__ __module__ __qualname__Z CounterModerrIC:\Program Files\Certbot\pkgs\cryptography\hazmat\primitives\kdf\kbkdf.pyrsrc@seZdZdZdZdZdS)CounterLocationZ before_fixedZ after_fixedZ middle_fixedN)rrr BeforeFixed AfterFixed MiddleFixedrrrrrsrc @s`eZdZddddddddddd dd Zedd d d d ZddddddZddddZdS) _KBKDFDeriverztyping.Callablerinttyping.Optional[int]rtyping.Optional[bytes]) prfmodelengthrlenllenlocationbreak_locationlabelcontextfixedc Cspt|s Jt|tstdt|ts0td|durJ|tjurJtd|durd|tjkrdtd|dur~t|ts~td|dur|dkrtd|s| r| rtd|dus||std |dur| durtd |durt|tstd |durd }| durd } t d |t d| ||_ ||_ ||_ ||_||_||_||_||_| |_d|_| |_dS)Nzmode must be of type Modez(location must be of type CounterLocationzPlease specify a break_locationzJbreak_location is ignored when location is not CounterLocation.MiddleFixedz!break_location must be an integerrz)break_location must be a positive integerz9When supplying fixed data, label and context are ignored.zrlen must be between 1 and 4zPlease specify an llenzllen must be an integerr#r$F)callable isinstancer TypeErrorrr ValueErrorr_valid_byte_lengthrZ _check_bytes_prf_mode_length_rlen_llen _location_break_location_label_context_used _fixed_data) selfrrrrr r!r"r#r$r%rrr__init__%sZ        z_KBKDFDeriver.__init__bool)valuereturncCs@t|tstdtd|}dt|kr6dkst|jtr|jt|krt d|d|j}||jd}td|dD]@} ||} t| |j} || |} | | || qd|d|jS) NrATr&r<zThere are too many iterations.z"break_location offset > len(fixed))r5rrZ_check_bytesliker.r>r/powr?r*_generate_fixed_inputr1rrrr(r2rranger,updateappendfinalizejoin) r7rArBroundsoutputZr_binr%Zdata_before_ctrZdata_after_ctrihZcounterZ input_datarrrderivexs>       z_KBKDFDeriver.derive)r;cCsB|jrt|jtr|jSt|jd|j}d|jd|j |gS)NrDr&) r6r(r@rr>r.r0rKr3r4)r7Zl_valrrrrFsz#_KBKDFDeriver._generate_fixed_inputN)rrrr8 staticmethodr+rPrFrrrrr$s  I 0rc@sheZdZddddddddddddd dd d d Zd ddddZd d dddZd d ddddZdS) KBKDFHMACNr"zhashes.HashAlgorithmrrrrr typing.Any) algorithmrrrr r!r#r$r%backendr"c  Csbt|tjstdtjddlm} | |s:tdtj||_ t |j |||||| ||| |_ dS)Nz5Algorithm supplied is not a supported hash algorithm.rrWz5Algorithm supplied is not a supported hmac algorithm.) r(r Z HashAlgorithmrrZUNSUPPORTED_HASH,cryptography.hazmat.backends.openssl.backendrWZhmac_supported _algorithmrr,_deriver) r7rVrrrr r!r#r$r%rWr"osslrrrr8s0   zKBKDFHMAC.__init__r@z hmac.HMACrAr;cCst||jSN)r ZHMACrZr7rArrrr,szKBKDFHMAC._prfcCs|j||jjSr^)r[rPrZZ digest_sizer_rrrrPszKBKDFHMAC.deriveNonerA expected_keyr;cCst|||stdSr^r Zbytes_eqrPrr7rArbrrrverifyszKBKDFHMAC.verify)Nrrrr8r,rPrerrrrrSs  &.rSc @sfeZdZdddddddddddddd d d Zd d dddZd d dddZd d ddddZdS) KBKDFCMACNrTrrrrrrU) rrrr r!r#r$r%rWr"c  CsRt|tjrt|tjs$tdtj||_d|_t |j |||||| ||| |_ dS)N7Algorithm supplied is not a supported cipher algorithm.) issubclassrZBlockCipherAlgorithmZCipherAlgorithmrrUNSUPPORTED_CIPHERrZ_cipherrr,r[) r7rVrrrr r!r#r$r%rWr"rrrr8s. zKBKDFCMAC.__init__r@z cmac.CMAC)_r;cCs|jdusJt|jSr^)rkr ZCMAC)r7rlrrrr,szKBKDFCMAC._prfr]cCsT|||_|jdusJddlm}||js>tdtj|j ||jj dS)NrrXrhrD) rZrkrYrWZcmac_algorithm_supportedrrrjr[rPZ block_size)r7rAr\rrrrPs   zKBKDFCMAC.deriver`racCst|||stdSr^rcrdrrrre)szKBKDFCMAC.verify)Nrfrrrrrgs  $'rg)Z __future__rtypingZ cryptographyrZcryptography.exceptionsrrrrZcryptography.hazmat.primitivesrr r r r Z"cryptography.hazmat.primitives.kdfr EnumrrrrSrgrrrrs   :