o
    )%a'                     @   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 deded	eje d
efddZ	ddeded
efddZdeded	eje d
ejeeje f fddZ	ddeded
efddZ	ddeded
efddZ	ddeded
ef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 ]2}t|D ]+}||||  }tdt	d|d d d || | d A }|dd  ||< qq|
 dksNJ |d| S )N   >Q   r          )r   r   r   	encryptorlenrangeupdatestructpackunpackfinalizejoin)	r   r   r	   backendr   njib r   H/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/keywrap.py
_wrap_core   s   (r!   key_to_wrapc                    sx   t |}t| dv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                       g | ]
} ||d   qS r   r   .0r   r"   r   r    
<listcomp>5       z aes_key_wrap.<locals>.<listcomp>)r   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 ]6}tt|D ]-}tdt	d|d || | d A ||  }|
|}	|	d d }|	dd  ||< qq| dksTJ ||fS )Nr   r   r   r   r   r   r   )r   r   r   	decryptorr   reversedr   r   r   r   r   r   )
r   r   r	   r   r2   r   r   r   Zatrr   r   r   r    _unwrap_core9   s     
r4   c                    s   t |}t| dvrtddtdt  }dt d  d } d|   t dkrJtt| t | }|	|  }|
 dksHJ |S  fdd	td
t dD }t| |||S )Nr#   r'      YYz>ir       r   c                    r)   r*   r   r+   r-   r   r    r.   d   r/   z-aes_key_wrap_with_padding.<locals>.<listcomp>r   )r   r   r0   r   r   r   r   r   r   r   r   r   r!   )r   r"   r   aivZpadr   r   r	   r   r-   r    aes_key_wrap_with_paddingR   s   r8   wrapped_keyc                    sr  t |}t dk rtdt| dvrtdt dkrEtt| t | }| }|	 dks6J |d d }|dd  }d}n& fdd	t
d
t dD }|d
}	t|}t| |	||\}}d|}td|dd  \}
d| |
 }t|d d drd|d  |
  k rd| krn t |d
krt|| d  d| st |d
kr|S |d |  S )Nr$   zMust be at least 16 bytesr#   r'   r   r   r   c                    r)   r*   r   r+   r9   r   r    r.   {   r/   z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   z>I   r5   r6   )r   r   InvalidUnwrapr0   r   r   r   r2   r   r   r   popr4   r   r   r   r   )r   r9   r   r2   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rtdt| dvr$tdd} fd	d
tdt dD }|d}t| |||\}}t||sKt 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                    r)   r*   r   r+   r:   r   r    r.      r/   z"aes_key_unwrap.<locals>.<listcomp>r   )	r   r   r<   r0   r   r=   r4   r   r   )r   r9   r   r7   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)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   bytesZListr!   r1   ZTupler4   r8   r?   r@   	Exceptionr<   r   r   r   r    <module>   st   




.
