
    i                        d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZmZ d dlmZ erd dlmZ d dlmZ d	Zg d
Z G d d      Z G d de      Zy)    )annotationsN)Iterable)TYPE_CHECKINGBinaryIONoReturn)HashMismatchHashMissingInstallationError)read_chunks)Mapping)_Hashsha256)r   sha384sha512c                  |    e Zd ZdZdddZddZedd       ZddZddZ	ddZ
dd	Zdd
ZddZddZddZddZy)HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nc                    i }|B|j                         D ]/  \  }}t        |      D cg c]  }|j                          c}||<   1 || _        yc c}w )zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)itemssortedlower_allowed)selfhashesallowedalgkeysks         M/root/searxng-venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py__init__zHashes.__init__   sW    
 #\\^ A	T39$<@a	@A    As   Ac                   t        |t              st        S |s| S | s|S i }|j                  j	                         D ]9  \  }}|| j                  vr|D cg c]  }|| j                  |   v s| c}||<   ; t        |      S c c}w N)
isinstancer   NotImplementedr   r   )r   othernewr   valuesvs         r   __and__zHashes.__and__*   s    %(!! KL  >>//1 	FKC$--'#)EaQ$--2D-DECH	F c{ Fs   B+Bc                V    t        d | j                  j                         D              S )Nc              3  2   K   | ]  }t        |        y wr!   )len).0digestss     r   	<genexpr>z&Hashes.digest_count.<locals>.<genexpr>?   s     FG3w<Fs   )sumr   r&   r   s    r   digest_countzHashes.digest_count=   s     Ft}}/C/C/EFFF    c                >    || j                   j                  |g       v S )z/Return whether the given hex digest is allowed.)r   get)r   	hash_name
hex_digests      r   is_hash_allowedzHashes.is_hash_allowedA   s    T]]..y"===r2   c                   i }| j                   j                         D ]  }	 t        j                  |      ||<    |D ](  }|j                         D ]  }|j                  |        * |j                         D ]&  \  }}|j                         | j                   |   v s& y | j                  |       y# t        t
        f$ r t        d|       w xY w)zCheck good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        zUnknown hash name: N)r   r   hashlibr%   
ValueError	TypeErrorr
   r&   updater   	hexdigest_raise)r   chunksgotsr5   chunkhashgots          r   check_against_chunkszHashes.check_against_chunksE   s     ++- 	KIK")++i"8Y	K  	#E #E"#	# #jjl 	NIs}}$--	"::	 	D 	* K'*=i[(IJJKs   B33Cc                .    t        | j                  |      r!   )r   r   r   r@   s     r   r>   zHashes._raise\   s    4==$//r2   c                6    | j                  t        |            S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rD   r   )r   files     r   check_against_filezHashes.check_against_file_   s     ((T):;;r2   c                h    t        |d      5 }| j                  |      cd d d        S # 1 sw Y   y xY w)Nrb)openrI   )r   pathrH   s      r   check_against_pathzHashes.check_against_pathg   s1    $ 	1**40	1 	1 	1s   (1c                \    |j                         D ]  \  }}| j                  ||      s y y)z3Return whether any of the given hashes are allowed.TF)r   r7   )r   r   r5   r6   s       r   
has_one_ofzHashes.has_one_ofk   s4    %+\\^ 	!Iz##Iz:	 r2   c                ,    t        | j                        S )z,Return whether I know any known-good hashes.)boolr   r0   s    r   __bool__zHashes.__bool__r   s    DMM""r2   c                `    t        |t              st        S | j                  |j                  k(  S r!   )r"   r   r#   r   )r   r$   s     r   __eq__zHashes.__eq__v   s%    %(!!}}..r2   c           	         t        dj                  t        d | j                  j	                         D                          S )N,c              3  V   K   | ]!  \  }}|D ]  }d j                  ||f        # yw):N)join)r,   r   digest_listdigests       r   r.   z"Hashes.__hash__.<locals>.<genexpr>~   s>      (["-  HHc6]++s   '))rB   rZ   r   r   r   r0   s    r   __hash__zHashes.__hash__{   s=    HH ,0MM,?,?,A 
 	
r2   r!   )r   zdict[str, list[str]] | NonereturnNone)r$   r   r^   r   )r^   int)r5   strr6   ra   r^   rR   )r?   zIterable[bytes]r^   r_   r@   zdict[str, _Hash]r^   r   )rH   r   r^   r_   )rM   ra   r^   r_   )r   zMapping[str, str]r^   rR   )r^   rR   )r$   objectr^   rR   )__name__
__module____qualname____doc__r   r(   propertyr1   r7   rD   r>   rI   rN   rP   rS   rU   r]    r2   r   r   r      sT    

 & G G>.0<1#/
	
r2   r   c                  ,     e Zd ZdZd fdZddZ xZS )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.

    c                2    t         |   t        g i       y)z!Don't offer the ``hashes`` kwarg.)r   N)superr   FAVORITE_HASH)r   	__class__s    r   r   zMissingHashes.__init__   s     	 34r2   c                B    t        |t           j                               r!   )r	   rn   r=   rF   s     r   r>   zMissingHashes._raise   s    $}-779::r2   )r^   r_   rb   )rd   re   rf   rg   r   r>   __classcell__)ro   s   @r   rk   rk      s    5;r2   rk   )
__future__r   r9   collections.abcr   typingr   r   r   pip._internal.exceptionsr   r	   r
   pip._internal.utils.miscr   r   r   rn   STRONG_HASHESr   rk   ri   r2   r   <module>rx      sM    "  $ 4 4 Q Q 0' 
 /l
 l
^;F ;r2   