
    !j[                        d Z ddlmZmZ ddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ 	 ddlmZ n# e$ r	 dd	lmZ Y nw xY wd
ZdZeez   ZdZdZd)dZd*dZd+dZd,dZd-dZd.d"Z G d# d$          Zd/d(ZdS )0z<Cryptography to read and write encrypted MinIO Admin payload    )absolute_importannotationsN)Typehash_secret_raw)AESChaCha20_Poly1305)GcmMode)ChaCha20Poly1305Cipher)BaseHTTPResponse)HTTPResponse   i @         aead_idintkeybytesnoncereturn GcmMode | ChaCha20Poly1305Cipherc                    | dk    r t          j        |t           j        |          S | dk    rt          j        ||          S t	          d          )zGet cipher for AEAD ID.r      )r   r   zUnknown AEAD ID {aead_id})r   newMODE_GCMr   
ValueError)r   r   r   s      V/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/minio/crypto.py_get_cipherr   A   sQ     !||wsCL%000!|| $E::::
0
1
11    secretsaltc           
     D    t          | |ddddt          j        d          S )zGenerate 256-bit Argon2ID keyr   i      r      )r   r    	time_costmemory_costparallelismhash_lentypeversion)r   r   ID)r   r    s     r   _generate_keyr+   N   s3    W	 	 	 	r   padded_noncec                R    t          | ||          }d|                                z   S )zGenerate additional data    )r   digest)r   r   r,   ciphers       r   _generate_additional_datar1   \   s(     #|44FV]]__$$r   additional_datac                    d| dd         z   S )z0Mark additional data as the last in the sequence   r   N )r2   s    r   _mark_as_lastr6   d   s    _QRR(((r   idxc                6    | |                     dd          z   S )zSet nonce id (4 last bytes)r"   little)	byteorder)to_bytes)r   r7   s     r   _update_nonce_idr<   i   s    3<<X<6666r   payloadpasswordstrc                j   t          j        t                    }t          j        t                    }t	          |                                |          }d}|dz   }t          |d         ||          }t          dt          |           t                    }d}	||z   |z   }
|D ]}|	dz  }	||d         k    rt          |          }t          ||	          }t          |d         ||          }|                    |           |                    | ||t          z                      \  }}|
|z  }
|
|z  }
|
S )zEncrypt given payload.r.          r   r   )osurandom
_NONCE_LEN	_SALT_LENr+   encoder1   rangelen_CHUNK_SIZEr6   r<   r   updateencrypt_and_digest)r=   r>   r   r    r   r   r,   r2   indicesnonce_idresultir0   encrypted_datahmac_tags                  r   encryptrS   n   s9   Jz""E:i  D
))4
0
0CG..L/
CNNOAs7||[11GHG^e#F  A+O<<O'x88WQZl;;o&&&#)#<#<AamO$$
 $
  	. (Mr   c                  Z    e Zd ZdZddZd Zd Zd	 Zd
 Zd Z	dddZ
ddZddZddZdS )DecryptReaderz\
    BufferedIOBase compatible reader represents decrypted data of MinioAdmin
    APIs.
    responser   r   r   c                   || _         || _        d | _        | j                             d          }t	          |          dk    rt          d          |d d         | _        |d         | _        |dd          | _        t          | j        | j                  | _
        | j        dz   }t          | j        | j
        |          | _        d| _        d| _        d| _        d S )	N)   zinsufficient datar   !   rA   r   r   F)	_response_secret_payloadreadrI   IOError_salt_aead_id_noncer+   _keyr1   _additional_data_chunk_count
_is_closed)selfrV   r   headerr,   s        r   __init__zDecryptReader.__init__   s    !$$R((v;;"-...CRC[
r
RSSk!$,
;;	{%88 9M49l!
 !
 r   c                    | S Nr5   rg   s    r   	__enter__zDecryptReader.__enter__   s    r   c                *    |                                  S rk   )close)rg   exc_type	exc_valueexc_tracebacks       r   __exit__zDecryptReader.__exit__   s    zz||r   c                    dS )zReturn this is readable.Tr5   rl   s    r   readablezDecryptReader.readable   s    tr   c                    dS )zReturn this is not writeable.Fr5   rl   s    r   	writeablezDecryptReader.writeable   s    ur   c                j    | j                                          | j                                          dS )z-Close response and release network resources.N)rZ   ro   release_connrl   s    r   ro   zDecryptReader.close   s0    ##%%%%%r   Fr=   
last_chunkboolr   c                f   | xj         dz  c_         |rt          | j                  | _        t          | j        | j                   }t          | j        | j        |          }|                    | j                   |t           d         }|dt                    }|
                    ||          }|S )zDecrypt given payload.r   N)re   r6   rc   r<   ra   r   r`   rb   rK   _TAG_LENdecrypt_and_verify)rg   r=   rz   r,   r0   rR   rQ   decrypted_datas           r   _decryptzDecryptReader._decrypt   s    q 	I$1$2G$H$HD!'T[AAT]DI|DDd+,,,H9::& 8),22>8LLr   c                ^   | j         rdS t          | j                  dt          z   k    r| j                            dt          z   t          | j                  z
            }| xj        |z  c_        t          |          dk    r	d| _         dS t          | j                  dt          z   k    dS )z4Read a chunk at least one byte more than chunk size.Tr   r   F)rf   rI   rd   _MAX_CHUNK_SIZErZ   r]   )rg   chunks     r   _read_chunkzDecryptReader._read_chunk   s    ? 	4$+1#677N''O(;c$+>N>N(NOOEKK5 KK5zzQ"&t $+1#677 ur   c                D   |                                  }t          | j                  dk    r| j        S t          }t          | j                  |k     rt          | j                  }d}| j        d|         }| j        |d         | _        |                     ||          S )zRead and decrypt response.r   TN)r   rI   rd   r   r   )rg   stoplengthr=   s       r   _readzDecryptReader._read   s    !!t{q  ; t{f$$%%FD+gvg&k&''*}}Wd+++r      c              #     K   	 |                                  }|sdS |r<|}|t          |          k     r
|d|         }|t          |          d         }|V  |<W)z
        Stream extracted payload from response data. Upon completion, caller
        should call self.close() to release network resources.
        TN)r   rI   )rg   	num_bytesdatarO   s       r   streamzDecryptReader.stream   s}      
		::<<D  s4yy((!*9*-FCKKLL)  			r   N)rV   r   r   r   )F)r=   r   rz   r{   r   r   )r   r{   )r   r   )r   )__name__
__module____qualname____doc__ri   rm   rs   ru   rw   ro   r   r   r   r   r5   r   r   rU   rU      s         
       (        & & &
       , , , ,     r   rU   rV   r   
secret_keyc                    d}t          | |                                          5 }|                                D ]}||z  }	 ddd           n# 1 swxY w Y   |S )zDecrypt response data.r   N)rU   rG   r   )rV   r   rO   readerr   s        r   decryptr      s    F	x!2!2!4!4	5	5 MMOO 	 	DdNFF	               Ms   AAA)r   r   r   r   r   r   r   r   )r   r   r    r   r   r   )r   r   r   r   r,   r   r   r   )r2   r   r   r   )r   r   r7   r   r   r   )r=   r   r>   r?   r   r   )rV   r   r   r?   r   r   ) r   
__future__r   r   rC   argon2.low_levelr   r   Crypto.Cipherr   r   Crypto.Cipher._mode_gcmr	   Crypto.Cipher.ChaCha20_Poly1305r
   urllib3.responser   ImportErrorr   r}   rJ   r   rF   rE   r   r+   r1   r6   r<   rS   rU   r   r5   r   r   <module>r      s  " C B 3 3 3 3 3 3 3 3 				 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 + + + + + + B B B B B BB1111111 B B BAAAAAAAAB8 [(	

2 
2 
2 
2   % % % %) ) ) )
7 7 7 7
   :g g g g g g g gT     s   3 A A