
    Wh                        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Zg d	Z G d
 d          Z G d de          ZdS )    )annotationsN)Iterable)TYPE_CHECKINGBinaryIONoReturn)HashMismatchHashMissingInstallationError)read_chunks)_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dS )/HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nhashesdict[str, list[str]] | NonereturnNonec                    i }|6|                                 D ]!\  }}d t          |          D             ||<   "|| _        dS )zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        Nc                6    g | ]}|                                 S  )lower).0ks     l/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/pip/_internal/utils/hashes.py
<listcomp>z#Hashes.__init__.<locals>.<listcomp>'   s     @@@a		@@@    )itemssorted_allowed)selfr   allowedalgkeyss        r   __init__zHashes.__init__   sV    
 #\\^^ A A	T@@6$<<@@@r   otherc                     t          |t                    st          S |s S  s|S i }|j                                        D ]!\  } j        vr fd|D             |<   "t          |          S )Nc                2    g | ]}|j                  v |S r   )r!   )r   vr$   r"   s     r   r   z"Hashes.__and__.<locals>.<listcomp>:   s*    EEEaQ$-2D-D-D-D-D-Dr   )
isinstancer   NotImplementedr!   r   )r"   r'   newvaluesr$   s   `   @r   __and__zHashes.__and__*   s    %(( 	"!!  	K 	L  >//11 	F 	FKC$-''EEEEE6EEECHHc{{r   intc                b    t          d | j                                        D                       S )Nc              3  4   K   | ]}t          |          V  d S N)len)r   digestss     r   	<genexpr>z&Hashes.digest_count.<locals>.<genexpr>?   s(      FFG3w<<FFFFFFr   )sumr!   r.   r"   s    r   digest_countzHashes.digest_count=   s-    FFt}/C/C/E/EFFFFFFr   	hash_namestr
hex_digestboolc                <    || j                             |g           v S )z/Return whether the given hex digest is allowed.)r!   get)r"   r:   r<   s      r   is_hash_allowedzHashes.is_hash_allowedA   s    T]..y"====r   chunksIterable[bytes]c                   i }| j                                         D ]A}	 t          j        |          ||<   # t          t
          f$ r t          d|           w xY w|D ].}|                                D ]}|                    |           /|	                                D ])\  }}|
                                | j         |         v r dS *|                     |           dS )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"   rA   gotsr:   chunkhashgots          r   check_against_chunkszHashes.check_against_chunksE   s    ++-- 	K 	KIK")+i"8"8Y	* K K K'(Ii(I(IJJJK  	# 	#E # #E""""# #jjll 	 	NIs}}$-	"::: ;Ds	   7$ArJ   dict[str, _Hash]r   c                ,    t          | j        |          r3   )r   r!   r"   rJ   s     r   rI   zHashes._raise\   s    4=$///r   filer   c                F    |                      t          |                    S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rN   r   )r"   rR   s     r   check_against_filezHashes.check_against_file_   s      ((T):):;;;r   pathc                    t          |d          5 }|                     |          cd d d            S # 1 swxY w Y   d S )Nrb)openrT   )r"   rU   rR   s      r   check_against_pathzHashes.check_against_pathg   s    $ 	1**400	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   377dict[str, str]c                l    |                                 D ]\  }}|                     ||          r dS dS )z3Return whether any of the given hashes are allowed.TF)r   r@   )r"   r   r:   r<   s       r   
has_one_ofzHashes.has_one_ofk   sG    %+\\^^ 	 	!Iz##Iz:: ttur   c                *    t          | j                  S )z,Return whether I know any known-good hashes.)r=   r!   r8   s    r   __bool__zHashes.__bool__r   s    DM"""r   objectc                Z    t          |t                    st          S | j        |j        k    S r3   )r+   r   r,   r!   )r"   r'   s     r   __eq__zHashes.__eq__v   s)    %(( 	"!!}..r   c           	         t          d                    t          d | j                                        D                                           S )N,c              3  T   K   | ]#\  }}|D ]}d                      ||f          V  $dS ):N)join)r   r$   digest_listdigests       r   r6   z"Hashes.__hash__.<locals>.<genexpr>~   sa        (["-   HHc6]++      r   )rL   rf   r    r!   r   r8   s    r   __hash__zHashes.__hash__{   s\    HH  ,0M,?,?,A,A     
 
 	
r   r3   )r   r   r   r   )r'   r   r   r   )r   r0   )r:   r;   r<   r;   r   r=   )rA   rB   r   r   rJ   rO   r   r   )rR   r   r   r   )rU   r;   r   r   )r   rZ   r   r=   )r   r=   )r'   r_   r   r=   )__name__
__module____qualname____doc__r&   r/   propertyr9   r@   rN   rI   rT   rY   r\   r^   ra   ri   r   r   r   r   r      s#        

  
  
  
  
    & G G G XG> > > >   .0 0 0 0< < < <1 1 1 1   # # # #/ / / /
	
 	
 	
 	
 	
 	
r   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.

    r   r   c                Z    t                                          t          g i           dS )z!Don't offer the ``hashes`` kwarg.)r   N)superr&   FAVORITE_HASH)r"   	__class__s    r   r&   zMissingHashes.__init__   s+     	 344444r   rJ   rO   r   c                Z    t          |t                                                             r3   )r	   rt   rH   rQ   s     r   rI   zMissingHashes._raise   s!    $}-7799:::r   )r   r   rj   )rk   rl   rm   rn   r&   rI   __classcell__)ru   s   @r   rq   rq      s[         5 5 5 5 5 5; ; ; ; ; ; ; ;r   rq   )
__future__r   rD   collections.abcr   typingr   r   r   pip._internal.exceptionsr   r	   r
   pip._internal.utils.miscr   r   rt   STRONG_HASHESr   rq   r   r   r   <module>r~      s   " " " " " "  $ $ $ $ $ $ 4 4 4 4 4 4 4 4 4 4 Q Q Q Q Q Q Q Q Q Q 0 0 0 0 0 0 
 
 /..l
 l
 l
 l
 l
 l
 l
 l
^; ; ; ; ;F ; ; ; ; ;r   