3 l�_b�@s�ddlmZmZmZddlZddlmZddlmZddl m Z ddl m Z ddl mZdd �Zdd d �Zd d �Zddd�Zddd�Zddd�ZGdd�de�ZdS)�)�absolute_import�division�print_functionN)� _get_backend)�Cipher)�AES)�ECB)�bytes_eqc Cs�tt|�t�|�j�}t|�}xttd�D]h}xbt|�D]V}|j|||�}tjdtj d|dd��d|||dA�}|dd�||<q6Wq(W|dj |�S)N�z>Q�r��i����) rrr� encryptor�len�range�update�struct�pack�unpack�join) � wrapping_key�a�r�backendr�n�j�i�b�r�/usr/lib64/python3.6/keywrap.py� _wrap_cores,r csxt|�}t|�d krtd��t��dkr0td��t��ddkrHtd��d }�fd d �tdt��d�D�}t||||�S) N��� z/The wrapping key must be a valid AES key lengthz)The key to wrap must be at least 16 bytesr rz-The key to wrap must be a multiple of 8 bytess��������csg|]}�||d��qS)r r)�.0r)� key_to_wraprr� 1sz aes_key_wrap..)r!r"r#)rr� ValueErrorrr )rr%rrrr)r%r� aes_key_wrap%s  r(c Cs�tt|�t�|�j�}t|�}x�ttd��D]p}xjtt|��D]Z}tjdtj d|�d|||dA�||}|j |�} | dd�}| dd�||<q>Wq,W||fS)Nr z>Qrr r i����) rrr� decryptorr�reversedrrrrr) rrrrr)rrrZatrrrrr� _unwrap_core5s"   r+cs�t|�}t|�d krtd��dtjdt���}dt��dd}�d|�t��dkr�tt|�t�|�j�}|j |��}|S�fd d �t d t��d�D�}t ||||�SdS) Nr!r"r#z/The wrapping key must be a valid AES key lengths�YY�z>ir �csg|]}�||d��qS)r r)r$r)r%rrr&\sz-aes_key_wrap_with_padding..r)r!r"r#) rrr'rrrrrrrrr )rr%r�aivZpadrrrr)r%r�aes_key_wrap_with_paddingLs   r.c stt|�}t��dkrtd��t|�dkr0td��t��dkrztt|�t�|�j�}|j��}|dd�}|dd�}d}nL�fdd �t d t��d�D�}|j d �} t|�}t || ||�\}}d j |�}t jd |d d��\} d|| }t|dd �d� �sNd|d| k�od|kn �sN|d k�rTt|| d�d|� �rTt��|d k�rb|S|d| �SdS)Nr!zMust be at least 16 bytesr"r#z/The wrapping key must be a valid AES key lengthr r csg|]}�||d��qS)r r)r$r)� wrapped_keyrrr&qsz/aes_key_unwrap_with_padding..rr z>I�s�YY�r,)r!r"r#)rr� InvalidUnwrapr'rrrr)rr�popr+rrrr ) rr/rr)rr�datarrZ encrypted_aivZmlir)r/r�aes_key_unwrap_with_padding`s2         *& r4cs�t|�}t��dkrtd��t��ddkr4td��t|�d krHtd��d }�fd d �tdt��d�D�}|jd�}t||||�\}}t||�s�t��d j|�S)Nr"zMust be at least 24 bytesr rz-The wrapped key must be a multiple of 8 bytesr!r#z/The wrapping key must be a valid AES key lengths��������csg|]}�||d��qS)r r)r$r)r/rrr&�sz"aes_key_unwrap..r )r!r"r#) rrr1r'rr2r+r r)rr/rr-rrr)r/r�aes_key_unwrap�s    r5c@s eZdZdS)r1N)�__name__� __module__� __qualname__rrrrr1�sr1)N)N)N)N)Z __future__rrrrZcryptography.hazmat.backendsrZ&cryptography.hazmat.primitives.ciphersrZ1cryptography.hazmat.primitives.ciphers.algorithmsrZ,cryptography.hazmat.primitives.ciphers.modesrZ,cryptography.hazmat.primitives.constant_timer r r(r+r.r4r5� Exceptionr1rrrr�s        +