B
    i’»d    ã               @   s„   d dl Z d dlZd dlZd dlZd dlZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd	„ d	ejƒZ	e
d
kr€e ¡  dS )é    Nc               @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestCBC256NISTc             C   s‚   t  d dd¡ dd¡¡}t  d dd¡ dd¡¡}t  d dd¡ dd¡¡}t  d dd¡ dd¡¡}|  t |||¡|¡ d S )Nza
        603DEB10 15CA71BE 2B73AEF0 857D7781
        1F352C07 3B6108D7 2D9810A3 0914DFF4
        ú Ú Ú
z5
        00010203 04050607 08090A0B 0C0D0E0F
        z¹
        6BC1BEE2 2E409F96 E93D7E11 7393172A
        AE2D8A57 1E03AC9C 9EB76FAC 45AF8E51
        30C81C46 A35CE411 E5FBC119 1A0A52EF
        F69F2445 DF4F9B17 AD2B417B E66C3710
        z¹
        F58C4C04 D6E5F1BA 779EABFB 5F7BFBD6
        9CFC4E96 7EDB808D 679F777B C6702C7D
        39F23369 A9D9BACF A530E263 04231461
        B2EB05E2 C39BE9FC DA6C1907 8C6A9D1B
        )ÚbytesÚfromhexÚreplaceÚassertEqualÚtgcryptoÚcbc256_encrypt)ÚselfÚkeyÚivÚ	plaintextÚ
ciphertext© r   ú6/tmp/pip-unpacked-wheel-rb8agyfe/tests/cbc/test_cbc.pyÚtest_cbc256_encrypt   s    z"TestCBC256NIST.test_cbc256_encryptc             C   s‚   t  d dd¡ dd¡¡}t  d dd¡ dd¡¡}t  d dd¡ dd¡¡}t  d dd¡ dd¡¡}|  t |||¡|¡ d S )Nza
        603DEB10 15CA71BE 2B73AEF0 857D7781
        1F352C07 3B6108D7 2D9810A3 0914DFF4
        r   r   r   z5
        00010203 04050607 08090A0B 0C0D0E0F
        z¹
        F58C4C04 D6E5F1BA 779EABFB 5F7BFBD6
        9CFC4E96 7EDB808D 679F777B C6702C7D
        39F23369 A9D9BACF A530E263 04231461
        B2EB05E2 C39BE9FC DA6C1907 8C6A9D1B
        z¹
        6BC1BEE2 2E409F96 E93D7E11 7393172A
        AE2D8A57 1E03AC9C 9EB76FAC 45AF8E51
        30C81C46 A35CE411 E5FBC119 1A0A52EF
        F69F2445 DF4F9B17 AD2B417B E66C3710
        )r   r   r   r	   r
   Úcbc256_decrypt)r   r   r   r   r   r   r   r   Útest_cbc256_decrypt8   s    z"TestCBC256NIST.test_cbc256_decryptN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   r   c               @   sþ   e Zd Zd dd¡ZdZej e	¡d Z
xÐe e
¡D ]ÂZe
d e Zeeddd	žZx–e ee ¡ ¡D ]‚Ze ¡ \ZZZZZZZed
krždZeZeZdZdZndZeZeZdZdZeej eej !e¡d  !d¡d eeeeeeed	ƒ qfW W dQ R X q4W dS )ÚTestCBC256Cryptographya4  
    def test_cbc256_{mode}_{name}_{count}(self):
        key = bytes.fromhex("{key}")
        iv = bytes.fromhex("{iv}")
        plaintext = bytes.fromhex("{plaintext}")
        ciphertext = bytes.fromhex("{ciphertext}")
    
        self.assertEqual(tgcrypto.cbc256_{mode}({input}, key, iv), {output})
    z
    r   zfCOUNT = (\d+)\nKEY = (\w+)\nIV = (\w+)\n(PLAINTEXT|CIPHERTEXT) = (\w+)\n(PLAINTEXT|CIPHERTEXT) = (\w+)z/vectorsú/Úrzutf-8)ÚencodingZ	PLAINTEXTÚencryptr   r   ÚdecryptéÿÿÿÿÚ.r   )	ÚmodeÚnameÚcountr   r   r   r   ÚinputÚoutputN)"r   r   r   r   ÚTEMPLATEZPATTERNÚosÚpathÚdirnameÚ__file__Z	BASE_PATHÚlistdirÚopenÚfÚreÚfinditerÚreadÚmatchÚgroupsr#   r   r   Zplain_or_cipherZbytes1Ú_Zbytes2r!   r   r   r$   r%   ÚexecÚformatÚsplitr   r   r   r   r   S   s<   r   c               @   s`   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestCBC256Inputz]'\w+' does not (support|have) the buffer interface|a bytes-like object is required, not '\w+'c          	   C   s4   |   td¡ t t d¡t d¡¡ W d Q R X d S )Nz0function takes exactly \d arguments \(\d given\)é   é    )ÚassertRaisesRegexÚ	TypeErrorr
   r   r'   Úurandom)r   r   r   r   Ú&test_cbc256_encrypt_invalid_args_countŠ   s    z6TestCBC256Input.test_cbc256_encrypt_invalid_args_countc          	   C   s,   |   t| j¡ t ddd¡ W d Q R X d S )Né   é   é   )r:   r;   ÚTYPE_ERROR_PATTERNr
   r   )r   r   r   r   Ú%test_cbc256_encrypt_invalid_args_typeŽ   s    z5TestCBC256Input.test_cbc256_encrypt_invalid_args_typec          	   C   s6   |   td¡  t dt d¡t d¡¡ W d Q R X d S )NzData must not be emptyó    r9   r8   )r:   Ú
ValueErrorr
   r   r'   r<   )r   r   r   r   Útest_cbc256_encrypt_empty_data’   s    z.TestCBC256Input.test_cbc256_encrypt_empty_datac          	   C   s<   |   td¡& t t d¡t d¡t d¡¡ W d Q R X d S )Nz!Key size must be exactly 32 bytesr8   é   )r:   rD   r
   r   r'   r<   )r   r   r   r   Ú$test_cbc256_encrypt_invalid_key_size–   s    z4TestCBC256Input.test_cbc256_encrypt_invalid_key_sizec          	   C   s<   |   td¡& t t d¡t d¡t d¡¡ W d Q R X d S )Nz IV size must be exactly 16 bytesr8   r9   é   )r:   rD   r
   r   r'   r<   )r   r   r   r   Ú#test_cbc256_encrypt_invalid_iv_sizeš   s    z3TestCBC256Input.test_cbc256_encrypt_invalid_iv_sizec          	   C   s4   |   td¡ t t d¡t d¡¡ W d Q R X d S )Nz0function takes exactly \d arguments \(\d given\)r8   r9   )r:   r;   r
   r   r'   r<   )r   r   r   r   Ú&test_cbc256_decrypt_invalid_args_countž   s    z6TestCBC256Input.test_cbc256_decrypt_invalid_args_countc          	   C   s,   |   t| j¡ t ddd¡ W d Q R X d S )Nr>   r?   r@   )r:   r;   rA   r
   r   )r   r   r   r   Ú%test_cbc256_decrypt_invalid_args_type¢   s    z5TestCBC256Input.test_cbc256_decrypt_invalid_args_typec          	   C   s6   |   td¡  t dt d¡t d¡¡ W d Q R X d S )NzData must not be emptyrC   r9   r8   )r:   rD   r
   r   r'   r<   )r   r   r   r   Útest_cbc256_decrypt_empty_data¦   s    z.TestCBC256Input.test_cbc256_decrypt_empty_datac          	   C   s<   |   td¡& t t d¡t d¡t d¡¡ W d Q R X d S )Nz!Key size must be exactly 32 bytesr8   rF   )r:   rD   r
   r   r'   r<   )r   r   r   r   Ú$test_cbc256_decrypt_invalid_key_sizeª   s    z4TestCBC256Input.test_cbc256_decrypt_invalid_key_sizec          	   C   s<   |   td¡& t t d¡t d¡t d¡¡ W d Q R X d S )Nz IV size must be exactly 16 bytesr8   r9   rH   )r:   rD   r
   r   r'   r<   )r   r   r   r   Ú#test_cbc256_decrypt_invalid_iv_size®   s    z3TestCBC256Input.test_cbc256_decrypt_invalid_iv_sizeN)r   r   r   rA   r=   rB   rE   rG   rI   rJ   rK   rL   rM   rN   r   r   r   r   r7   ‡   s   r7   c               @   sÄ   e Zd ZdZdZdZdZd dd¡ZxLe	eƒD ]@Z
eejdd	e
e e d
e¡d ¡e e¡ee e¡ƒdƒ q.W xLe	eƒD ]@Z
eejd	de
e e d
e¡d ¡e e¡ee e¡ƒdƒ q|W dS )ÚTestCBC256Randomé@   r9   r8   iô  a  
    def test_cbc256_random_{mode1}_{count}(self):
        data = {data}
        key = {key}
        iv = {iv}
        iv_copy = iv.copy()

        a = tgcrypto.cbc256_{mode1}(data, key, iv)
        b = tgcrypto.cbc256_{mode2}(a, key, iv_copy)

        self.assertEqual(data, b)
    z
    r   r   r   r>   )Zmode1Zmode2r#   Údatar   r   N)r   r   r   ZDATA_CHUNK_MAX_SIZEZKEY_SIZEZIV_SIZEZTESTS_AMOUNTr   r&   Úranger#   r4   r5   r'   r<   ÚrandomÚrandintÚ	bytearrayr   r   r   r   rO   ³   s.   rO   Ú__main__)r'   rS   r.   Zunittestr
   ZTestCaser   r   r7   rO   r   Úmainr   r   r   r   Ú<module>   s   84,-