U
    gVS                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZmZ d dlmZ dd	 ZG d
d de jZG dd de jZG dd de jZi fddZedkrdd Ze jdd dS )    N)hexlify	unhexlify)list_test_cases)tobytesbchr)AESDES3)SHAKE128SHA256)Counterc                 C   s   t jt| d|S )N)data)r	   newr   read)taglength r   G/tmp/pip-unpacked-wheel-_q8s9isk/Cryptodome/SelfTest/Cipher/test_CTR.pyget_tag_random(   s    r   c                   @   s   e Zd ZeddZeddZeddZeddZej	d	ed
Z
ej	de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 d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z d6S )7CtrTestskey_128   key_192   nonce_32   nonce_64       prefix@   c                 C   sZ   t j| jt j| jd}tdd}||}t j| jt j| jd}||}| || d S )Ncounter	plaintexti@  )	r   r   r   MODE_CTRctr_128r   encryptdecryptassertEqualselfcipherptctZpt2r   r   r   test_loopback_1284   s    


zCtrTests.test_loopback_128c                 C   sZ   t j| jt j| jd}tdd}||}t j| jt j| jd}||}| || d S )Nr!   r#   i   )	r   r   r   r$   ctr_64r   r&   r'   r(   r)   r   r   r   test_loopback_64=   s    


zCtrTests.test_loopback_64c                 C   s4   |  ttj| jtj |  ttj| jtj| j d S N)	assertRaises	TypeErrorr   r   r   r   r$   r   r%   r*   r   r   r   test_invalid_counter_parameterF   s    z'CtrTests.test_invalid_counter_parameterc                 C   s   t j| jt j| jd}| |j| j tj| j	tj| j
d}| |j| j tjd| j| jd}tj| j	tj|d}| t|d d S )Nr!   r    )r   suffixnonce)r   r   r   r$   r/   r(   r7   r   r   r   r%   r   r   ZassertFalsehasattr)r*   r+   r"   r   r   r   test_nonce_attributeM   s    zCtrTests.test_nonce_attributec                 C   s  t j| jt j| jd}| |j| j tjd| jdd}t j| jt j|d}| |j|j tdd}| |	||	| t | jt jj}t | jt jj}| 
|| | t|d t j| jt jd	d}| d	|j |	d
 | jtt j| jt j| j| jd d S )Nr7   r    r   r   initial_valuer!   r#      r       s,  000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)r"   r7   )r   r   r   r$   r   r(   r7   r   r   r&   ZassertNotEquallenr2   r3   r%   )r*   cipher1r"   cipher2r,   Znonce1Znonce2r+   r   r   r   test_nonce_parameter[   s$    

 zCtrTests.test_nonce_parameterc                 C   s   t j| jt j| jdd}tjd| jdd}t j| jt j|d}tdd}| |||| t j| jt jdd}tjd|j	dd}t j| jt j|d}tdd}| |||| | j
tt j| jt j| jd	d
 d S )N  r7   r<   r    r;   r!   r#   r=   r<   r   )r"   r<   )r   r   r   r$   r   r   r   r(   r&   r7   r2   r3   r%   )r*   r@   r"   rA   r,   r   r   r   test_initial_value_parameterv   s&     

 z%CtrTests.test_initial_value_parameterc                 C   s   t j| jt j| jdd}t j| jt j| jdd}tdd}| |||| | jt	t j| jt jdd | jt	t j| jt j| jdd | jt	t j| jt jd	d | jt	t j| jt j| jd
d d S )N         rD   rC   r#   r=   s   55555555555555555rE   s	   555555555s   555555555555555s   5555555)
r   r   r   r$   r   r   r(   r&   r2   
ValueError)r*   r@   rA   r,   r   r   r   "test_initial_value_bytes_parameter   s0     
  z+CtrTests.test_initial_value_bytes_parameterc                 C   sD   | j ttj| jtjtdd | j ttj| jtjtdd d S )Nx   r!      )r2   rH   r   r   r   r$   r   r4   r   r   r   test_iv_with_matching_length   s    z%CtrTests.test_iv_with_matching_lengthc                 C   s*   t j| jt j| jd}| |jt j d S Nr!   )r   r   r   r$   r%   r(   
block_sizer*   r+   r   r   r   test_block_size_128   s    zCtrTests.test_block_size_128c                 C   s*   t j| jt j| jd}| |jt j d S rM   )r   r   r   r$   r/   r(   rN   rO   r   r   r   test_block_size_64   s    zCtrTests.test_block_size_64c                    s   dgd }t j| jt j| jd  fdd|D }t j| jt j| jd | d| d| t j| jt j| jd  fdd|D }t j| jt j| jd | d| d| d S )N   7777777d   r!   c                    s   g | ]}  |qS r   r&   .0xr+   r   r   
<listcomp>   s     z4CtrTests.test_unaligned_data_128.<locals>.<listcomp>r>   c                    s   g | ]}  |qS r   rT   rU   rX   r   r   rY      s     )r   r   r   r$   r%   r(   joinr&   r*   Z
plaintextsZciphertextsr   rX   r   test_unaligned_data_128   s    
z CtrTests.test_unaligned_data_128c                    s   dgd }t j| jtj| jd  fdd|D }t j| jtj| jd | d| d| t j| jtj| jd  fdd|D }t j| jtj| jd | d| d| d S )NrR   rS   r!   c                    s   g | ]}  |qS r   rT   rU   rX   r   r   rY      s     z3CtrTests.test_unaligned_data_64.<locals>.<listcomp>r>   c                    s   g | ]}  |qS r   rT   rU   rX   r   r   rY      s     )	r   r   r   r   r$   r/   r(   rZ   r&   r[   r   rX   r   test_unaligned_data_64   s    
zCtrTests.test_unaligned_data_64c                 C   sX   | j ttj| jtjd| jd | j ttj| jtj| jdd tj| jtj| jdd d S )N   r!   )r"   unknownF)r"   Z	use_aesni)r2   r3   r   r   r   r$   r%   r4   r   r   r   test_unknown_parameters   s      z CtrTests.test_unknown_parametersc                 C   s>   dD ]4}t j| jt j| jd}t||d}| |d qd S )N)r&   r'   r!   r>   )r   r   r   r$   r%   getattrr(   )r*   funcr+   resultr   r   r   test_null_encryption_decryption   s    z(CtrTests.test_null_encryption_decryptionc                 C   sd   t j| jt j| jd}|d | t|jd t j| jt j| jd}|d | t|jd d S )Nr!   r>   )	r   r   r   r$   r%   r&   r2   r3   r'   rO   r   r   r   test_either_encrypt_or_decrypt   s    

z'CtrTests.test_either_encrypt_or_decryptc                 C   s   t jdtdd d}d}tj| jtj|d}|d|  | t|jd tj| jtj|d}| t|jd|d   tj| jtj|d}|	d|  | t|j	d tj| jtj|d}| t|j	d|d   d S )	Nr   	      r   i   r!      9   )
r   r   r   r   r   r$   r&   r2   OverflowErrorr'   )r*   r"   Z	max_bytesr+   r   r   r   test_wrap_around   s    zCtrTests.test_wrap_aroundc                 C   s   d}d}t j| jt j| j|d}||}t j| jt jt| jt|d}|t|}| || | |j|j t j| jt j| j|d}|	|}t j| jt jt| jt|d}	|		t|}
| ||
 d S )Ns   1111111111111111rG   rD   )
r   r   r   r$   r   r&   	bytearrayr(   r7   r'   )r*   r   Zivr@   Zref1rA   Zref2Zcipher3Zref3Zcipher4Zref4r   r   r   test_bytearray   s2    

zCtrTests.test_bytearrayc                 C   s>   t jdt jdd}|dd }t| }| |d d S )Ns    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr>   r:      Bi@B Z@96204fc470476561a3a8f3b6fe6d24be85c87510b638142d1d0fb90989f8a6a6)r   r   r$   r&   r
   	hexdigestr(   )r*   r+   r-   digestr   r   r   test_very_long_data  s    zCtrTests.test_very_long_datac                 C   s   d}t jdt j| jd}||}td}t jdt j| jd}|j||d}| || | |d  t jdt j| jd}|j||d}| || | |d  d S Ns   55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555   4444444444444444r:      output)r   r   r$   r   r&   rl   r(   r'   )r*   r,   r+   r-   rv   resr   r   r   test_output_param  s    
zCtrTests.test_output_paramc                 C   s   d}t jdt j| jd}||}ttd}t jdt j| jd}|j||d | || t jdt j| jd}|j||d | || d S rr   )	r   r   r$   r   r&   
memoryviewrl   r(   r'   )r*   r,   r+   r-   rv   r   r   r   test_output_param_memoryview(  s    
z%CtrTests.test_output_param_memoryviewc                 C   s   d}d| }t jdt j| jd}||}t jdt j| jd}| jt|j|d| d t jdt j| jd}| jt|j|d| d t|d }t jdt j| jd}| jt	|j||d t jdt j| jd}| jt	|j||d d S )Nrt      5rs   r:      0ru   ri   )
r   r   r$   r   r&   r2   r3   r'   rl   rH   )r*   ZLEN_PTr,   r+   r-   Zshorter_outputr   r   r   test_output_param_neg7  s    
zCtrTests.test_output_param_negN)!__name__
__module____qualname__r   r   r   r   r   r   r   r/   r%   r.   r0   r5   r9   rB   rF   rI   rL   rP   rQ   r\   r]   r`   rd   re   rk   rm   rq   rx   rz   r}   r   r   r   r   r   +   s6   



			r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	SP800TestVectorszQClass exercising the CTR test vectors found in Section F.5
    of NIST SP 800-38Ac                 C   s   d}d}d}t jdtddd}t|}t|}t|}tj|tj|d}| ||| tj|tj|d}| ||| d S )	Nڀ6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710Z874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009ceeZ 2b7e151628aed2a6abf7158809cf4f3cr   f0f1f2f3f4f5f6f7f8f9fafbfcfd  nbitsr   r<   r!   r   r   r   r   r$   r(   r&   r'   r*   r#   Z
ciphertextkeyr"   r+   r   r   r   test_aes_128O  s    zSP800TestVectors.test_aes_128c                 C   s   d}d}d}t jdtddd}t|}t|}t|}tj|tj|d}| ||| tj|tj|d}| ||| d S )	Nr   Z1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e941e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050Z08e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7br   r   r   r   r!   r   r   r   r   r   test_aes_192f  s    zSP800TestVectors.test_aes_192c                 C   s   d}d}d}t jdtddd}t|}t|}t|}tj|tj|d}| ||| tj|tj|d}| ||| d S )	Nr   Z601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c52b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6Z@603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4r   r   r   r   r!   r   r   r   r   r   test_aes_256}  s    zSP800TestVectors.test_aes_256N)r~   r   r   __doc__r   r   r   r   r   r   r   r   K  s   r   c                   @   s:   e Zd ZdZg ZeD ]Zedd eD  qdd ZdS )RFC3686TestVectors)	) 53696e676c6520626c6f636b206d7367Z e4095d4fb7a7b3792d6175a3261311b8Z ae6852f8121067cc4bf7a5765577f39eZ000000300000000000000000)@000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fZ@5104a106168a72d9790d41ee8edad388eb2e1efc46da57c8fce630df9141be28Z 7e24067817fae0d743d6ce1f32539163Z006cb6dbc0543b59da48d90b)H000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223ZHc1cf48a89f2ffdd9cf4652e9efdb72d74540a42bde6d7836d59a5ceaaef3105325b2072fZ 7691be035e5020a8ac6e618529f9a0dcZ00e0017b27777f3f4a1786f0)r   Z 4b55384fe259c9c84e7935a003cbe928Z016af5b145fc9f579c175f93e3bfb0eed863d06ccfdb78515Z0000004836733c147d6d93cb)r   Z@453243fc609b23327edfaafa7131cd9f8490701c5ad4a79cfc1fe0ff42f4fb00Z07c5cb2401b3dc33c19e7340819e0f69c678c3db8e6f6a91aZ0096b03b020c6eadc2cb500d)r   ZH96893fc55e5c722f540b7dd1ddf7e758d288bc95c69165884536c811662f2188abee0935Z002bf391ee8ecb159b959617b0965279bf59b60a786d3e0feZ0007bdfd5cbd60278dcc0912)r   Z 145ad01dbf824ec7560863dc71e3e0c0Z@776beff2851db06f4c8a0542c8696f6c6a81af1eec96b4d37fc1d689e6c1c104Z00000060db5672c97aa8f0b2)r   Z@f05e231b3894612c49ee000b804eb2a9b8306b508f839d6a5530831d9344af1cZ@f6d66d6bd52d59bb0796365879eff886c66dd51a5b6a99744b50590c87a23884Z00faac24c1585ef15a43d875)r   ZHeb6c52821d0bbbf7ce7594462aca4faab407df866569fd07f48cc0b583d6071f1ec0e6b8Z@ff7a617ce69148e4f1726e2f43581de2aa62d9f805532edff1eed687fb54153dZ001cc5b751a51d70a1c11148c                 C   s   g | ]}t |qS r   )r   rU   r   r   r   rY     s     zRFC3686TestVectors.<listcomp>c                 C   sV   | j D ]J\}}}}tjd|d}tj|tj|d}||}| t|t| qd S )Nr   r   r!   )bindatar   r   r   r$   r&   r(   r   )r*   r,   r-   r   r   r"   r+   rc   r   r   r   runTest  s
    
zRFC3686TestVectors.runTestN)r~   r   r   r   r   tvappendr   r   r   r   r   r     s
   'r   c                 C   s,   g }|t t7 }|t t7 }|t g7 }|S r1   )r   r   r   r   )configtestsr   r   r   	get_tests  s
    r   __main__c                   C   s   t t S r1   )unittestZ	TestSuiter   r   r   r   r   <lambda>  r>   r   suite)ZdefaultTest)r   binasciir   r   ZCryptodome.SelfTest.st_commonr   ZCryptodome.Util.py3compatr   r   ZCryptodome.Cipherr   r   ZCryptodome.Hashr	   r
   ZCryptodome.Utilr   r   ZTestCaser   r   r   r   r~   r   mainr   r   r   r   <module>   s      "I: