U 巀gl@sddlZddlmZmZmZmZmZmZmZddl m Z m Z m Z ddl mZer\ddlmZdZdddgZGd d d ZGd d d eZdS) N) TYPE_CHECKINGBinaryIODictIterableListNoReturnOptional) HashMismatch HashMissingInstallationError) read_chunks)_Hashsha256sha384sha512c@seZdZdZd%eeeeefddddZdddddZ e e d d d Z eee d d dZeeddddZeedfddddZeddddZeddddZeeefe dddZe d dd Zee dd!d"Ze d d#d$ZdS)&HasheszaA wrapper that builds multiple hashes at once and checks them against known-good values N)hashesreturncCs>i}|dk r4|D]\}}ddt|D||<q||_dS)zo :param hashes: A dict of algorithm names pointing to lists of allowed hex digests NcSsg|] }|qS)lower).0krrH/opt/hc_python/lib/python3.8/site-packages/pip/_internal/utils/hashes.py $sz#Hashes.__init__..)itemssorted_allowed)selfrallowedalgkeysrrr__init__s zHashes.__init__)otherrcsbt|tstS|sSs|Si}|jD],\}jkr@q,fdd|D|<q,t|S)Ncsg|]}|jkr|qSr)r)rvrrrrr7sz"Hashes.__and__..) isinstancerNotImplementedrr)rr"newvaluesrr$r__and__'s  zHashes.__and__rcCstdd|jDS)Ncss|]}t|VqdSN)len)rdigestsrrr <sz&Hashes.digest_count..)sumrr(rrrr digest_count:szHashes.digest_count) hash_name hex_digestrcCs||j|gkS)z/Return whether the given hex digest is allowed.)rget)rr2r3rrris_hash_allowed>szHashes.is_hash_allowed)chunksrc Csi}|jD]>}zt|||<Wqttfk rJtd|YqXq|D]}|D]}||q^qR| D] \}}| |j|krxdSqx| |dS)zCheck good hashes against ones built from iterable of chunks of data. Raise HashMismatch if none match. zUnknown hash name: N) rr hashlibr' ValueError TypeErrorr r(updater hexdigest_raise)rr6gotsr2chunkhashgotrrrcheck_against_chunksBs zHashes.check_against_chunksr rr=rcCst|j|dSr+)r rrr=rrrr<Ysz Hashes._raise)filercCs|t|S)zaCheck good hashes against a file-like object Raise HashMismatch if none match. )rAr )rrDrrrcheck_against_file\szHashes.check_against_file)pathrc Cs,t|d}||W5QRSQRXdS)Nrb)openrE)rrFrDrrrcheck_against_pathds zHashes.check_against_pathcCs(|D]\}}|||rdSqdS)z3Return whether any of the given hashes are allowed.TF)rr5)rrr2r3rrr has_one_ofhs zHashes.has_one_ofcCs t|jS)z,Return whether I know any known-good hashes.)boolrr0rrr__bool__oszHashes.__bool__cCst|tstS|j|jkSr+)r%rr&r)rr"rrr__eq__ss z Hashes.__eq__cCs"tdtdd|jDS)N,css*|]"\}}|D]}d||fVqqdS):N)join)rr digest_listdigestrrrr.{sz"Hashes.__hash__..)r?rPrrrr0rrr__hash__xszHashes.__hash__)N)__name__ __module__ __qualname____doc__rrstrrr!r)propertyintr1rKr5rbytesrAr<rrErIrJrLobjectrMrSrrrrrs" rcs>eZdZdZddfdd Zeedfddd d ZZS) MissingHasheszA workalike for Hashes used when we're missing a hash for a requirement It computes the actual hash of the requirement and raises a HashMissing exception showing it to the user. Nr*cstjtgiddS)z!Don't offer the ``hashes`` kwarg.)rN)superr! FAVORITE_HASHr0 __class__rrr!szMissingHashes.__init__r rrBcCst|tdSr+)r r_r;rCrrrr<szMissingHashes._raise) rTrUrVrWr!rrXr< __classcell__rrr`rr]sr])r7typingrrrrrrrpip._internal.exceptionsr r r pip._internal.utils.miscr r r_ STRONG_HASHESrr]rrrrs$   o