o
    þÑÐb#  ã                   @   sT  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 dlmZ ded	ed
eje dedef
dd„Z	ddededeje defdd„Zded	ed
eje dedejeeje f f
dd„Z	ddededeje defdd„Z	ddededeje defdd„Z	ddededeje defdd„ZG dd„ deƒZdS )é    N)Ú_get_backend)ÚBackend)ÚCipher)ÚAES)ÚECB)Úbytes_eqÚwrapping_keyÚaÚrÚbackendÚ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
   r   r   ÚnÚjÚiÚb© r    úe/var/www/secure340b-portal/env/lib/python3.10/site-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>;   ó    z aes_key_wrap.<locals>.<listcomp>)r   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 ]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   r3   r   r   r   Zatrr   r    r    r!   Ú_unwrap_core?   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/   o   r0   z-aes_key_wrap_with_padding.<locals>.<listcomp>r   )r   r   r1   r   r   r   r   r   r   r   r   r   r"   )r   r#   r   ÚaivÚpadr   r   r
   r    r.   r!   Úaes_key_wrap_with_padding[   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/   ˆ   r0   z/aes_key_unwrap_with_padding.<locals>.<listcomp>r   z>Ié   r6   r7   )r   r   ÚInvalidUnwrapr1   r   r   r   r3   r   r   r   Úpopr5   r   r   r   r   )r   r;   r   r3   r   r	   Údatar   r
   Zencrypted_aivZmlir    r<   r!   Úaes_key_unwrap_with_paddings   sD   


ÿþþþýýrA   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/   ²   r0   z"aes_key_unwrap.<locals>.<listcomp>r   )	r   r   r>   r1   r   r?   r5   r   r   )r   r;   r   r8   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)r   ÚtypingZcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr   Z&cryptography.hazmat.primitives.ciphersr   Z1cryptography.hazmat.primitives.ciphers.algorithmsr   Z,cryptography.hazmat.primitives.ciphers.modesr   Z,cryptography.hazmat.primitives.constant_timer   ÚbytesÚListr"   ÚOptionalr2   ÚTupler5   r:   rA   rB   Ú	Exceptionr>   r    r    r    r!   Ú<module>   sŽ   ÿþýü
ûýÿþý
üÿþýü
ûýÿþý
üýÿþý
ü2ýÿþý
ü