
    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dS )    )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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     a/home/ubuntu/.hermes/hermes-agent/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#   rB   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rK   dict[str, _Hash]r   c                ,    t          | j        |          r4   )r   r"   r#   rK   s     r   rJ   zHashes._raise\   s    4=$///r   filer   c                F    |                      t          |                    S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rO   r   )r#   rS   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)openrU   )r#   rV   rS   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Mapping[str, str]c                l    |                                 D ]\  }}|                     ||          r dS dS )z3Return whether any of the given hashes are allowed.TF)r    rA   )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"   r9   s    r   __bool__zHashes.__bool__r   s    DM"""r   objectc                Z    t          |t                    st          S | j        |j        k    S r4   )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   r7   z"Hashes.__hash__.<locals>.<genexpr>~   sa        (["-   HHc6]++      r   )rM   rg   r!   r"   r    r9   s    r   __hash__zHashes.__hash__{   s\    HH  ,0M,?,?,A,A     
 
 	
r   r4   )r   r   r   r   )r(   r   r   r   )r   r1   )r;   r<   r=   r<   r   r>   )rB   rC   r   r   rK   rP   r   r   )rS   r   r   r   )rV   r<   r   r   )r   r[   r   r>   )r   r>   )r(   r`   r   r>   )__name__
__module____qualname____doc__r'   r0   propertyr:   rA   rO   rJ   rU   rZ   r]   r_   rb   rj   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   rK   rP   r   c                Z    t          |t                                                             r4   )r	   ru   rI   rR   s     r   rJ   zMissingHashes._raise   s!    $}-7799:::r   )r   r   rk   )rl   rm   rn   ro   r'   rJ   __classcell__)rv   s   @r   rr   rr      s[         5 5 5 5 5 5; ; ; ; ; ; ; ;r   rr   )
__future__r   rE   collections.abcr   typingr   r   r   pip._internal.exceptionsr   r	   r
   pip._internal.utils.miscr   r   r   ru   STRONG_HASHESr   rr   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   