
    )hl                         d dl Z d dlmZmZmZmZ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y)    N)TYPE_CHECKINGBinaryIODictIterableListNoReturnOptional)HashMismatchHashMissingInstallationError)read_chunks)_Hashsha256)r   sha384sha512c                       e Zd ZdZddeeeee   f      ddfdZddZ	e
defd       Zd	ed
edefdZdee   ddfdZdeedf   ddfdZdeddfdZdeddfdZdeeef   defdZdefdZdedefdZdefdZy)HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nhashesreturnc                     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)selfr   allowedalgkeysks         M/var/www/html/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py__init__zHashes.__init__   sW    
 #\\^ A	T39$<@a	@A    As   Aotherc                    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   r"   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    	hash_name
hex_digestc                 >    || j                   j                  |g       v S )z/Return whether the given hex digest is allowed.)r   get)r   r5   r6   s      r    is_hash_allowedzHashes.is_hash_allowed>   s    T]]..y"===r4   chunksc                    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   r:   gotsr5   chunkhashgots          r    check_against_chunkszHashes.check_against_chunksB   s     ++- 	KIK")++i"8Y	K  	#E #E"#	# #jjl 	NIs}}$--	"::	 	D 	* K'*=i[(IJJKs   B33CrB   r   r   c                 .    t        | j                  |      r$   )r
   r   r   rB   s     r    rA   zHashes._raiseY   s    4==$//r4   filec                 6    | j                  t        |            S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rF   r   )r   rI   s     r    check_against_filezHashes.check_against_file\   s     ((T):;;r4   pathc                 h    t        |d      5 }| j                  |      cd d d        S # 1 sw Y   y xY w)Nrb)openrK   )r   rL   rI   s      r    check_against_pathzHashes.check_against_pathd   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   r9   )r   r   r5   r6   s       r    
has_one_ofzHashes.has_one_ofh   s4    %+\\^ 	!Iz##Iz:	 r4   c                 ,    t        | j                        S )z,Return whether I know any known-good hashes.)boolr   r2   s    r    __bool__zHashes.__bool__o   s    DMM""r4   c                 `    t        |t              st        S | j                  |j                  k(  S r$   )r%   r   r&   r   )r   r"   s     r    __eq__zHashes.__eq__s   s%    %(!!}}..r4   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    r0   z"Hashes.__hash__.<locals>.<genexpr>{   s>      (["-  HHc6]++s   '))rD   r\   r   r   r   r2   s    r    __hash__zHashes.__hash__x   s=    HH ,0MM,?,?,A 
 	
r4   r$   )r"   r   r   r   )__name__
__module____qualname____doc__r	   r   strr   r!   r*   propertyintr3   rT   r9   r   bytesrF   rA   r   rK   rP   rR   rU   objectrW   r_    r4   r    r   r      s   

 xS$s)^(<= 
  
 & Gc G G> ># >$ >8E? t .04W- 0* 0<x <D <1s 1t 1c3h D #$ #/F /t /
	
# 	
r4   r   c                   >     e Zd ZdZd fdZdeedf   ddf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   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4r4   rB   r   r   c                 B    t        |t           j                               r$   )r   rn   r@   rH   s     r    rA   zMissingHashes._raise   s    $}-779::r4   )r   N)	r`   ra   rb   rc   r!   r   rd   rA   __classcell__)ro   s   @r    rk   rk      s)    5;4W- ;* ;r4   rk   )r<   typingr   r   r   r   r   r   r	   pip._internal.exceptionsr
   r   r   pip._internal.utils.miscr   r   rn   STRONG_HASHESr   rk   ri   r4   r    <module>rv      sG     T T T Q Q 0
 
 /l
 l
^;F ;r4   