U
    c                     @   s   d dl 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 j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 je	d	ddZde	e	e je	dddZde	e	e je	dddZG dd deZdS )    N)Cipher)AES)ECB)bytes_eq)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   Z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!   Elib/python3.8/site-packages/cryptography/hazmat/primitives/keywrap.py
_wrap_core   s    $ r#   )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>5   s     z aes_key_wrap.<locals>.<listcomp>)r   
ValueErrorr   r#   )r   r$   r%   r   r   r!   r/   r"   aes_key_wrap&   s    r2   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   r3   r   r   r   Zatrr    r!   r!   r"   _unwrap_core9   s      
r5   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!   r-   r/   r!   r"   r0   e   s     z-aes_key_wrap_with_padding.<locals>.<listcomp>r   )r   r1   r   r   r   r   r   r   r   r   r   r#   )r   r$   r%   aivZpadr   r    r   r!   r/   r"   aes_key_wrap_with_paddingP   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!   r-   r;   r!   r"   r0   }   s     z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   r7   r   r   r6   r8   )r   InvalidUnwrapr1   r   r   r   r3   r   r   r   r   popr5   r   r   r   r   )r   r;   r%   r3   outr   datar   r   Zencrypted_aivZmlir    r!   r<   r"   aes_key_unwrap_with_paddingi   sB    



 

rA   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-   r<   r!   r"   r0      s     z"aes_key_unwrap.<locals>.<listcomp>r   )r   r=   r1   r   r>   r5   r   r   )r   r;   r%   r9   r   r   r!   r<   r"   aes_key_unwrap   s    

rB   c                   @   s   e Zd ZdS )r=   N)__name__
__module____qualname__r!   r!   r!   r"   r=      s   r=   )N)N)N)N)typingZ&cryptography.hazmat.primitives.ciphersr   Z1cryptography.hazmat.primitives.ciphers.algorithmsr   Z,cryptography.hazmat.primitives.ciphers.modesr   Z,cryptography.hazmat.primitives.constant_timer   bytesZListr#   ZAnyr2   ZTupler5   r:   rA   rB   	Exceptionr=   r!   r!   r!   r"   <module>   sV      1 