U
    e]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|}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)	wrapping_keyarbackendr   njib r!   H/usr/lib/python3/dist-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          /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   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    r1   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   r2   r   r   r   Zatrr    r!   r!   r"   _unwrap_core3   s     
r4   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 )Nr$   r(      YYz>ir       r   c                    s   g | ]} ||d   qS r*   r!   r+   r-   r!   r"   r/   V   s     z-aes_key_wrap_with_padding.<locals>.<listcomp>r   )r   r0   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    r8   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 bytesr$   r(   r   r   r   c                    s   g | ]} ||d   qS r*   r!   r+   wrapped_keyr!   r"   r/   j   s     z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   z>I   r5   r6   )r   InvalidUnwrapr0   r   r   r   r2   r   r   r   r   popr4   r   r   r   r   )r   r:   r   r2   r    r   datar   r   Zencrypted_aivZmlir!   r9   r"   aes_key_unwrap_with_paddingZ   sB    



 

r?   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!   r+   r9   r!   r"   r/      s     z"aes_key_unwrap.<locals>.<listcomp>r   )r   r<   r0   r   r=   r4   r   r   )r   r:   r   r7   r   r   r!   r9   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<   )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#   r1   r4   r8   r?   r@   	Exceptionr<   r!   r!   r!   r"   <module>   s   +