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   Úatrr   r   r   r    Ú_unwrap_core9   s     ÿýÿ
ôr5   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'   ó   ¦YY¦z>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   ÚaivÚpadr   r   r	   r   r-   r    Úaes_key_wrap_with_paddingR   s   r:   Ú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ƒr©d|d  |
  k r•d| kr©n tƒ ‚|d
kr¬t|| d … d| ƒs¬tƒ ‚|d
kr²|S |d | … S )Nr$   zMust be at least 16 bytesr#   r'   r   r   r   c                    r)   r*   r   r+   ©r;   r   r    r.   {   r/   z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   z>Ié   r6   r7   )r   r   ÚInvalidUnwrapr0   r   r   r   r2   r   r   r   Úpopr5   r   r   r   r   )r   r;   r   r2   r   r   Údatar   r	   Úencrypted_aivÚmlir   r<   r    Úaes_key_unwrap_with_paddingh   s8   


ÿ" þrC   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?   r5   r   r   )r   r;   r   r8   r	   r   r   r<   r    Úaes_key_unwrap•   s   


rD   c                   @   s   e Zd ZdS )r>   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r    r>   ¬   s    r>   )N)r   ÚtypingÚcryptography.hazmat.backendsr   Ú&cryptography.hazmat.primitives.ciphersr   Ú1cryptography.hazmat.primitives.ciphers.algorithmsr   Ú,cryptography.hazmat.primitives.ciphers.modesr   Ú,cryptography.hazmat.primitives.constant_timer   ÚbytesÚListr!   r1   ÚTupler5   r:   rC   rD   Ú	Exceptionr>   r   r   r   r    Ú<module>   st   ÿÿÿ
þÿÿÿ
þÿÿÿ
þÿÿÿ
þÿÿÿ
þ.ÿÿÿ
þ