B
    \V                 @   s   d dl mZmZ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 Zd	d
 Zdd Zdd Zdd Zdd ZG dd deZdS )    )absolute_importdivisionprint_functionN)Cipher)AES)ECB)bytes_eqc       	      C   s   t t| t | }t|}xttdD ]h}xbt|D ]V}||||  }tdt	d|d d d || | d A }|dd  ||< q6W q(W |
 dkst|d| S )N   z>Q   r      i    )r   r   r   	encryptorlenrangeupdatestructpackunpackfinalizeAssertionErrorjoin)	wrapping_keyarbackendr   njib r   Elib/python3.7/site-packages/cryptography/hazmat/primitives/keywrap.py
_wrap_core   s    ,r!   c                sp   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)          z/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 bytess   c                s   g | ]} ||d   qS )r
   r   ).0r   )key_to_wrapr   r    
<listcomp>/   s    z aes_key_wrap.<locals>.<listcomp>)r   
ValueErrorr   r!   )r   r&   r   r   r   r   )r&   r    aes_key_wrap$   s    r)   c       
   	   C   s   t t| t | }t|}xttdD ]p}xjtt|D ]Z}tdt	d|d || | d A ||  }|
|}	|	d d }|	dd  ||< q>W q,W | dkst||fS )Nr	   z>Qr   r   r
   ir   )r   r   r   	decryptorr   reversedr   r   r   r   r   r   r   )
r   r   r   r   r*   r   r   r   Zatrr   r   r   r    _unwrap_core3   s    "

r,   c                s   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 )N)r"   r#   r$   z/The wrapping key must be a valid AES key lengths   YYz>ir
       r   c                s   g | ]} ||d   qS )r
   r   )r%   r   )r&   r   r    r'   V   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   aivZpadr   r   r   r   )r&   r    aes_key_wrap_with_paddingG   s    r/   c                sv  t  dk rtdt | dkr(tdt  dkrtt| t | }| }| dksdt	|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rPd|d  |
  k r(d| krPn n$|d
krVt|| d  d| sVt |d
krd|S |d |  S d S )Nr"   zMust be at least 16 bytes)r"   r#   r$   z/The wrapping key must be a valid AES key lengthr   r
   r   c                s   g | ]} ||d   qS )r
   r   )r%   r   )wrapped_keyr   r    r'   j   s    z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   z>I   s   YYr-   )r   InvalidUnwrapr(   r   r   r   r*   r   r   r   r   popr,   r   r   r   r   )r   r0   r   r*   r   r   datar   r   Zencrypted_aivZmlir   )r0   r    aes_key_unwrap_with_paddingZ   s2    


($
r5   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 bytes)r"   r#   r$   z/The wrapping key must be a valid AES key lengths   c                s   g | ]} ||d   qS )r
   r   )r%   r   )r0   r   r    r'      s    z"aes_key_unwrap.<locals>.<listcomp>r   )r   r2   r(   r   r3   r,   r   r   )r   r0   r   r.   r   r   r   )r0   r    aes_key_unwrap   s    

r6   c               @   s   e Zd ZdS )r2   N)__name__
__module____qualname__r   r   r   r    r2      s   r2   )Z
__future__r   r   r   r   Z&cryptography.hazmat.primitives.ciphersr   Z1cryptography.hazmat.primitives.ciphers.algorithmsr   Z,cryptography.hazmat.primitives.ciphers.modesr   Z,cryptography.hazmat.primitives.constant_timer   r!   r)   r,   r/   r5   r6   	Exceptionr2   r   r   r   r    <module>   s   +