o
    Þý°jÇ  ã                   @   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rqdd„ Z ej!dd� dS 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   ú—/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/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r2tƒ ‚|r:t	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ÚmodulusÚbase_bÚexp_bÚ	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#   r3   ©r4   r%   Úexpectedr-   r   r   r   Útest_large_1a   s   zTestModExp.test_large_1c                 C   s    d}t |dtƒ}|  |d¡ d S )Nr6   r   r/   )r#   r9   r3   )r4   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#   r8   r9   r3   )r4   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#   r8   ©r4   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ÿÿÿé@   )r9   r7   r#   r3   r:   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/   )r9   r?   r   r#   r8   r@   r   r   r   Útest_even_modulus{   s   zTestModExp.test_even_modulusc                 C   s‚   t  ¡  tdƒ¡}tddƒD ]0}t | |¡¡dB }t | |¡¡| }t | |¡¡}t|||ƒ}t	|||ƒ}|  
||¡ qd S )NÚTestr/   éd   )r   r   ÚupdateÚbÚranger   Ú
from_bytesÚreadr7   r#   r3   )r4   ÚprngÚlengthÚmodulus2r%   Ú	exponent2r;   r-   r   r   r   Útest_several_lengths   s   ùzTestModExp.test_several_lengthsc           	      C   sº   t tdƒƒ}tdƒD ]P}tdƒD ]I}| d¡dB }| d¡| }| |d | ¡}t|||ƒ}t|||ƒ}|  ||¡ |d|d | > d N }t|||ƒ}t|||ƒ}|  ||¡ qq
d S )NzTest variable exponenté   é   éð   r/   é   ©r   rI   rJ   Úgetrandbitsr7   r#   r3   )	r4   rM   ÚiÚjr'   r%   Úexponentr;   r-   r   r   r   Útest_variable_exponentŠ   s   óÿz!TestModExp.test_variable_exponentc           	      C   óx   t tdƒƒ}d}tdƒD ]-}| d| ¡dB }| d| ¡| }| d| ¡}t|||ƒ}t|||ƒ}|  ||¡ qd S )NzTest 63é?   éÐ  rU   r/   rV   ©	r4   rM   rN   Ú_r'   r%   rZ   r;   r-   r   r   r   Útest_stress_63œ   ó   ùzTestModExp.test_stress_63c           	      C   r\   )NzTest 64rB   r^   rU   r/   rV   r_   r   r   r   Útest_stress_64¨   rb   zTestModExp.test_stress_64c           	      C   r\   )NzTest 65éA   r^   rU   r/   rV   r_   r   r   r   Útest_stress_65´   rb   zTestModExp.test_stress_65N)r   r   r   r5   r<   r=   r>   rA   rC   rE   rQ   r[   ra   rc   re   r   r   r   r   r.   \   s    r.   c                 C   s   g }|t tƒ7 }|S ©N)r   r.   )ÚconfigÚtestsr   r   r   Ú	get_testsÁ   s   ri   Ú__main__c                   C   s   t  tƒ ¡S rf   )ÚunittestÚ	TestSuiteri   r   r   r   r   Ú<lambda>È   s    rm   Úsuite)ÚdefaultTest)"Ú__doc__rk   ÚCryptodome.SelfTest.st_commonr   ÚCryptodome.Util.numberr   r   ÚCryptodome.Util.py3compatÚCryptodome.Util._raw_apir   r   r   r	   r
   ÚCryptodome.Hashr   ÚCryptodome.Math.Numbersr   ÚCryptodome.Math._IntegerCustomr   ÚCryptodome.Random.randomr   r   r$   r   r#   r8   r9   ÚTestCaser.   ri   r   rn   Úmainr   r   r   r   Ú<module>   s*   !eþ