U
    
;g                     @  s   d dl m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ddd	d
dZddddddddZddddd	ddZddddddddZddddddddZddddddddZG dd deZdS )     )annotationsN)Cipher)AES)ECB)bytes_eqbyteszlist[bytes])wrapping_keyarreturnc                 C  s   t t| t  }t|}tdD ]d}t|D ]V}||||  }tj|d d dd|| | d A j	ddd}|dd  ||< q0q$|
 dkst|d| S )	N      big	byteorder   lengthr       )r   r   r   	encryptorlenrangeupdateint
from_bytesto_bytesfinalizeAssertionErrorjoin)r   r	   r
   r   njib r$   J/tmp/pip-unpacked-wheel-yjz0rwd7/cryptography/hazmat/primitives/keywrap.py
_wrap_core   s    $ r&   z
typing.Any)r   key_to_wrapbackendr   c                   sn   t | dkrtdt  dk r(tdt  d dkr@t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>6   s     z aes_key_wrap.<locals>.<listcomp>)r   
ValueErrorr   r&   )r   r'   r(   r	   r
   r$   r2   r%   aes_key_wrap'   s    r5   ztuple[bytes, list[bytes]]c           	      C  s   t t| t  }t|}ttdD ]l}tt|D ]Z}tj|dd|| | d A j	ddd||  }|
|}|d d }|dd  ||< q8q(| dkst||fS )	Nr   r   r   r   r   r   r   r   )r   r   r   	decryptorr   reversedr   r   r   r   r   r   r   )	r   r	   r
   r6   r    r!   r"   Zatrr#   r$   r$   r%   _unwrap_core:   s      
r8   c                   s   t | dkrtddt  jddd }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-      YY   r   r   r       r   c                   s   g | ]} ||d   qS r/   r$   r0   r2   r$   r%   r3   f   s     z-aes_key_wrap_with_padding.<locals>.<listcomp>r   )r   r4   r   r   r   r   r   r   r   r   r   r&   )r   r'   r(   aivpadr   r#   r
   r$   r2   r%   aes_key_wrap_with_paddingQ   s    
 r>   )r   wrapped_keyr(   r   c                   sr  t  dk rtdt | dkr(tdt  dkrtt| t  }| }| dksbt	|d d }|dd  }d}nJ fdd	t
d
t  dD }|d
}	t |}t| |	|\}}d|}tj|dd  dd}
d| |
 }t|d d drLd|d  |
  k r$d| krLn n$|d
krRt|| d  d| sRt |d
kr`|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$   r0   r?   r$   r%   r3   ~   s     z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   r:   r   r   r9   r;   )r   InvalidUnwrapr4   r   r   r   r6   r   r   r   r   popr8   r   r   r   r   )r   r?   r(   r6   outr	   datar    r
   Zencrypted_aivZmlir#   r$   r@   r%   aes_key_unwrap_with_paddingj   sB    



 

rE   c                   s   t  dk rtdt  d dkr,tdt | dkr@t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$   r0   r@   r$   r%   r3      s     z"aes_key_unwrap.<locals>.<listcomp>r   )r   rA   r4   r   rB   r8   r   r   )r   r?   r(   r<   r
   r	   r$   r@   r%   aes_key_unwrap   s    

rF   c                   @  s   e Zd ZdS )rA   N)__name__
__module____qualname__r$   r$   r$   r%   rA      s   rA   )N)N)N)N)
__future__r   typingZ&cryptography.hazmat.primitives.ciphersr   Z1cryptography.hazmat.primitives.ciphers.algorithmsr   Z,cryptography.hazmat.primitives.ciphers.modesr   Z,cryptography.hazmat.primitives.constant_timer   r&   r5   r8   r>   rE   rF   	ExceptionrA   r$   r$   r$   r%   <module>   s       1 