U
    ÈZj§  ã                   @   sâ   d Z ddlZddlmZ ddlmZmZ ddlT ddlm	Z	m
Z
mZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ dd„ ZG dd„ deƒZdd„ ZdZdZG dd„ dejƒZi fdd„ZedkrÞdd„ Z ej!dd� dS )z.Self-test for the custom module exponentiationé    N)Úlist_test_cases)Úlong_to_bytesÚbytes_to_long)Ú*)Úload_pycryptodome_raw_libÚcreate_string_bufferÚget_raw_bufferÚc_size_tÚc_ulonglong)ÚSHAKE128)ÚInteger)Ú_raw_montgomery)ÚStrongRandomc                 C   s   t tj| d�ƒ}|S )N)Údata)r   r   Únew)ÚtagÚrng© r   úc/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/SelfTest/Math/test_modexp.pyÚ
create_rng9   s    r   c                   @   s   e Zd ZdS )ÚExceptionModulusN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   =   s   r   c           	   	      s„   t tt| ||ƒƒƒ‰ ‡ fdd„| ||fD ƒ\}}}tˆ ƒ}t ||||tˆ ƒtdƒ¡}|dkrdtƒ ‚|rtt	d| ƒ‚t
t|ƒƒ}|S )Nc                    s   g | ]}t |ˆ ƒ‘qS r   )r   )Ú.0Úx©Úmax_lenr   r   Ú
<listcomp>C   s     zmonty_pow.<locals>.<listcomp>é    é   zmonty_pow failed with error: %d)Úlenr   Úmaxr   r   Ú	monty_powr	   r
   r   Ú
ValueErrorr   r   )	ÚbaseÚexpÚmodulusZbase_bZexp_bZ	modulus_bÚoutÚerrorÚresultr   r   r   r#   @   s&    
ÿú	r#   l‰   MAUûjb*a�\ˆ}ã8Àz‹09’c_(…LmJËC0:8yÒeZI¾fî7‹j3D’N`&E[@z¯^:â
ágŸ8*7cÆHo)Ra…·>)<õemaÞc€C¾P:I';d<Ôa÷ïFuëMó%Œtz¬4CLŸJÆ)sCRuUM¾2
=	PT9‚÷ZV!ç0s²_\ä©yëTµvŸGv1&;ôBÉ~:6“µ\¬.÷t…N­Ï}ÿØvÎâYC"ca�(d	[Œ2ö\4ëY>=tOjEGþŒK¿a�¬R44œ<ëO‹I*¾#Ð¤`( ¢XWp, l‰   ©uM~æL«®o[*®QvU%=ÒQÈU)5d«³_š*i§R¶¼y¶^ëiæn3&y_ó!oÍicpJFX•QM0,þJ&[{"sÅ}ÁNŽ,ŒC20\'•j7Ö.Å8aMRÉMt
CIsD	‹k·Äo¿C•vj'ûðŠ]Ë/S<iJvcT�r.wFúFuZ±eâq9<ì*M‰["ºýt,`@T:KŽZ
Î'«S˜nÆk¡D5…x€l!Xµyy„9À9øv—M"*Ÿ^× x†+j~oÕB8ßs?vj	…r‘K?/ýjç fe@\¥6Öd7€lH3Ö c                   @   sl   e 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d„ Zdd„ ZdS )Ú
TestModExpc                 C   s   |   dtdddƒ¡ d S )Né   é   é   é   )ÚassertEqualr#   )Úselfr   r   r   Ú
test_small^   s    zTestModExp.test_smallc                 C   s,   d}t |ttƒ}t|ttƒ}|  ||¡ d S )Nì   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)ÚpowÚ	exponent1Úmodulus1r#   r0   ©r1   r%   Úexpectedr*   r   r   r   Útest_large_1a   s    zTestModExp.test_large_1c                 C   s    d}t |dtƒ}|  |d¡ d S )Nr3   r   r,   )r#   r6   r0   )r1   r%   r*   r   r   r   Útest_zero_expg   s    zTestModExp.test_zero_expc                 C   s   t dttƒ}|  |d¡ d S )Nr   )r#   r5   r6   r0   )r1   r*   r   r   r   Útest_zero_basel   s    zTestModExp.test_zero_basec                 C   s,   d}|   tt|td¡ |   ttddd¡ d S )Nl   ÿÿÿÿÿÿÿÿÿÿÿÿÿ r   )ÚassertRaisesr   r#   r5   ©r1   r%   r   r   r   Útest_zero_modulusp   s    zTestModExp.test_zero_modulusc                 C   s8   t d }t|t d> t ƒ}t|t d> t ƒ}|  ||¡ d S )Niÿÿÿé@   )r6   r4   r#   r0   r7   r   r   r   Útest_larger_exponentu   s    zTestModExp.test_larger_exponentc                 C   s"   t d? }|  tt|tt d ¡ d S )Né   r,   )r6   r<   r   r#   r5   r=   r   r   r   Útest_even_modulus{   s    zTestModExp.test_even_modulusc                 C   s‚   t  ¡  tdƒ¡}tddƒD ]`}t | |¡¡dB }t | |¡¡| }t | |¡¡}t|||ƒ}t	|||ƒ}|  
||¡ qd S )NZTestr,   éd   )r   r   ÚupdateÚbÚranger   Ú
from_bytesÚreadr4   r#   r0   )r1   ÚprngÚlengthZmodulus2r%   Z	exponent2r8   r*   r   r   r   Útest_several_lengths   s    zTestModExp.test_several_lengthsc           	      C   sº   t tdƒƒ}tdƒD ] }tdƒD ]’}| d¡dB }| d¡| }| |d | ¡}t|||ƒ}t|||ƒ}|  ||¡ |d|d | > d N }t|||ƒ}t|||ƒ}|  ||¡ q qd S )NzTest variable exponenté   é   éð   r,   é   ©r   rE   rF   Úgetrandbitsr4   r#   r0   )	r1   rI   ÚiÚjr'   r%   Úexponentr8   r*   r   r   r   Útest_variable_exponentŠ   s    z!TestModExp.test_variable_exponentc           	      C   sx   t tdƒƒ}d}tdƒD ]Z}| d| ¡dB }| d| ¡| }| d| ¡}t|||ƒ}t|||ƒ}|  ||¡ qd S )NzTest 63é?   éÐ  rO   r,   rP   ©	r1   rI   rJ   Ú_r'   r%   rT   r8   r*   r   r   r   Útest_stress_63œ   s    zTestModExp.test_stress_63c           	      C   sx   t tdƒƒ}d}tdƒD ]Z}| d| ¡dB }| d| ¡| }| d| ¡}t|||ƒ}t|||ƒ}|  ||¡ qd S )NzTest 64r?   rW   rO   r,   rP   rX   r   r   r   Útest_stress_64¨   s    zTestModExp.test_stress_64c           	      C   sx   t tdƒƒ}d}tdƒD ]Z}| d| ¡dB }| d| ¡| }| d| ¡}t|||ƒ}t|||ƒ}|  ||¡ qd S )NzTest 65éA   rW   rO   r,   rP   rX   r   r   r   Útest_stress_65´   s    zTestModExp.test_stress_65N)r   r   r   r2   r9   r:   r;   r>   r@   rB   rK   rU   rZ   r[   r]   r   r   r   r   r+   \   s   r+   c                 C   s   g }|t tƒ7 }|S ©N)r   r+   )ÚconfigZtestsr   r   r   Ú	get_testsÁ   s    r`   Ú__main__c                   C   s   t  tƒ ¡S r^   )ÚunittestZ	TestSuiter`   r   r   r   r   Ú<lambda>È   ó    rc   Úsuite)ZdefaultTest)"Ú__doc__rb   ZCrypto.SelfTest.st_commonr   ZCrypto.Util.numberr   r   ZCrypto.Util.py3compatZCrypto.Util._raw_apir   r   r   r	   r
   ZCrypto.Hashr   ZCrypto.Math.Numbersr   ZCrypto.Math._IntegerCustomr   ZCrypto.Random.randomr   r   r$   r   r#   r5   r6   ZTestCaser+   r`   r   re   Úmainr   r   r   r   Ú<module>"   s&   e