B
    `'                 @   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|}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)	r   r   r	   backendr   njib r   U/home/dcms/DCMS/lib/python3.7/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)          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   )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    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_core9   s    "

r+   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 )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&   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    r/   )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 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   )r0   r   r   r&   {   s    z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   z>I   s   YYr,   )r   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_paddingh   s4    


($
r5   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 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   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   )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    r(   Tupler+   r/   r5   r6   	Exceptionr2   r   r   r   r   <module>   s&   ,