U
    [e'                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ eeeje eddd	Zdeeed
ddZeeeje ejeeje f dddZdeeed
ddZdeeedddZdeeedddZG dd deZdS )    N)_get_backend)Cipher)AES)ECB)bytes_eq)wrapping_keyarreturnc           	      C   s   t t| t | }t|}tdD ]d}t|D ]V}||||  }tdt	d|d d d || | d A }|dd  ||< q2q&|
 dkst|d| S )N   >Q   r          )r   r   r   	encryptorlenrangeupdatestructpackunpackfinalizeAssertionErrorjoin)	r   r   r	   backendr   njib r    h/var/www/html/services/stratfitenv/lib/python3.8/site-packages/cryptography/hazmat/primitives/keywrap.py
_wrap_core   s     &r"   )r   key_to_wrapr
   c                    sx   t |}t| dkrtdt dk r0tdt d dkrHtdd} fd	d
tdt dD }t| |||S )N          /The wrapping key must be a valid AES key lengthr%   z)The key to wrap must be at least 16 bytesr   r   z-The key to wrap must be a multiple of 8 bytes   c                    s   g | ]} ||d   qS r   r    .0r   r#   r    r!   
<listcomp>5   s     z aes_key_wrap.<locals>.<listcomp>)r   r   
ValueErrorr   r"   )r   r#   r   r   r	   r    r-   r!   aes_key_wrap'   s    r0   c           
   	   C   s   t t| t | }t|}ttdD ]l}tt|D ]Z}tdt	d|d || | d A ||  }|
|}	|	d d }|	dd  ||< q:q*| dkst||fS )Nr   r   r   r   r   r   r   )r   r   r   	decryptorr   reversedr   r   r   r   r   r   r   )
r   r   r	   r   r1   r   r   r   Zatrr   r    r    r!   _unwrap_core9   s      
r3   c                    s   t |}t| dkrtddtdt  }dt d  d } d|   t dkrtt| t | }|	|  }|
 dkst|S  fdd	td
t dD }t| |||S d S )Nr$   r(      YYz>ir       r   c                    s   g | ]} ||d   qS r*   r    r+   r-   r    r!   r.   d   s     z-aes_key_wrap_with_padding.<locals>.<listcomp>r   )r   r   r/   r   r   r   r   r   r   r   r   r   r   r"   )r   r#   r   aivpadr   r   r	   r    r-   r!   aes_key_wrap_with_paddingR   s    r8   )r   wrapped_keyr
   c                    s~  t |}t dk rtdt| dkr0tdt dkrtt| t | }| }|	 dkslt
|d d }|dd  }d}nL fdd	td
t dD }|d
}	t|}t| |	||\}}d|}td|dd  \}
d| |
 }t|d d drXd|d  |
  k r0d| krXn n$|d
kr^t|| d  d| s^t |d
krl|S |d |  S d S )Nr%   zMust be at least 16 bytesr$   r(   r   r   r   c                    s   g | ]} ||d   qS r*   r    r+   r9   r    r!   r.   {   s     z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   z>I   r4   r5   )r   r   InvalidUnwrapr/   r   r   r   r1   r   r   r   r   popr3   r   r   r   r   )r   r9   r   r1   r   r   datar   r	   Zencrypted_aivZmlir    r:   r!   aes_key_unwrap_with_paddingh   sD    



 

r?   c                    s   t |}t dk rtdt d dkr4tdt| dkrHtdd} fd	d
tdt dD }|d}t| |||\}}t||st d|S )Nr&   zMust be at least 24 bytesr   r   z-The wrapped key must be a multiple of 8 bytesr$   r(   r)   c                    s   g | ]} ||d   qS r*   r    r+   r:   r    r!   r.      s     z"aes_key_unwrap.<locals>.<listcomp>r   )	r   r   r<   r/   r   r=   r3   r   r   )r   r9   r   r6   r	   r   r    r:   r!   aes_key_unwrap   s    

r@   c                   @   s   e Zd ZdS )r<   N)__name__
__module____qualname__r    r    r    r!   r<      s   r<   )N)N)N)N)r   typingZcryptography.hazmat.backendsr   Z&cryptography.hazmat.primitives.ciphersr   Z1cryptography.hazmat.primitives.ciphers.algorithmsr   Z,cryptography.hazmat.primitives.ciphers.modesr   Z,cryptography.hazmat.primitives.constant_timer   bytesListr"   r0   Tupler3   r8   r?   r@   	Exceptionr<   r    r    r    r!   <module>   sR             .  