3 ig@sddlZddlmZmZmZmZmZddlmZm Z m Z ddl m Z er`ddlm Z ddlmZdZddd gZGd d d ZGd d d eZdS)N) TYPE_CHECKINGBinaryIODictIteratorList) HashMismatch HashMissingInstallationError) read_chunks)_Hash)NoReturnsha256sha384sha512c@seZdZdZd#eeeefddddZdddddZe e d d d Z eee d d dZ eeddddZeedfddddZeddddZeddddZe d ddZee ddd Ze d d!d"ZdS)$HasheszaA wrapper that builds multiple hashes at once and checks them against known-good values N)hashesreturncCs8i}|dk r.x |jD]\}}t|||<qW||_dS)zo :param hashes: A dict of algorithm names pointing to lists of allowed hex digests N)itemssorted_allowed)selfrallowedalgkeysr9/tmp/pip-build-88gy_88q/pip/pip/_internal/utils/hashes.py__init__s zHashes.__init__)otherrcsft|tstS|sSs|Si}x:|jjD],\}jkrBq.fdd|D|<q.Wt|S)Ncsg|]}|jkr|qSr)r).0v)rrrr ;sz"Hashes.__and__..) isinstancerNotImplementedrr)rrnewvaluesr)rrr__and__+s  zHashes.__and__)rcCstdd|jjDS)Ncss|]}t|VqdS)N)len)rZdigestsrrr @sz&Hashes.digest_count..)sumrr$)rrrr digest_count>szHashes.digest_count) hash_name hex_digestrcCs||jj|gkS)z/Return whether the given hex digest is allowed.)rget)rr*r+rrris_hash_allowedBszHashes.is_hash_allowed)chunksrc Csi}xL|jjD]>}ytj|||<Wqttfk rLtd|YqXqWx(|D] }x|jD]}|j|qfWqXWx*|j D]\}}|j |j|krdSqW|j |dS)zCheck good hashes against ones built from iterable of chunks of data. Raise HashMismatch if none match. zUnknown hash name: N) rrhashlibr# ValueError TypeErrorr r$updater hexdigest_raise)rr.gotsr*chunkhashgotrrrcheck_against_chunksFs zHashes.check_against_chunksr r )r5rcCst|j|dS)N)rr)rr5rrrr4]sz Hashes._raise)filercCs|jt|S)zaCheck good hashes against a file-like object Raise HashMismatch if none match. )r9r )rr:rrrcheck_against_file`szHashes.check_against_file)pathrc Cs t|d }|j|SQRXdS)Nrb)openr;)rr<r:rrrcheck_against_pathhs zHashes.check_against_pathcCs t|jS)z,Return whether I know any known-good hashes.)boolr)rrrr__bool__lszHashes.__bool__cCst|tstS|j|jkS)N)r!rr"r)rrrrr__eq__ps z Hashes.__eq__cCs"tdjtdd|jjDS)N,css*|]"\}}|D]}dj||fVqqdS):N)join)rrZ digest_listdigestrrrr'ysz"Hashes.__hash__..)r7rErrr)rrrr__hash__us zHashes.__hash__)N)__name__ __module__ __qualname____doc__rstrrrr%propertyintr)r@r-rbytesr9r4rr;r?rAobjectrBrGrrrrrs 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. N)rcstjtgiddS)z!Don't offer the ``hashes`` kwarg.)rN)superr FAVORITE_HASH)r) __class__rrrszMissingHashes.__init__r r )r5rcCst|tjdS)N)rrSr3)rr5rrrr4szMissingHashes._raise) rHrIrJrKrrrLr4 __classcell__rr)rTrrQsrQ)r/ZtypingrrrrrZpip._internal.exceptionsrrr Zpip._internal.utils.miscr r r rS STRONG_HASHESrrQrrrrs    h