U
    ÈZjü  ã                   @   s¢   d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
 ddlmZ G dd„ deƒZd	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 modular multiplicationé    N)Úlist_test_cases)Úlong_to_bytesÚbytes_to_long)Úcreate_string_bufferÚget_raw_bufferÚc_size_t)Ú_raw_montgomeryc                   @   s   e Zd ZdS )ÚExceptionModulusN)Ú__name__Ú
__module__Ú__qualname__© r   r   úd/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/SelfTest/Math/test_modmult.pyr	   1   s   r	   c           	      C   sˆ   | |kr| |; } ||kr ||; }t |ƒ}t|ƒ}t | |ƒ}t ||ƒ}t|ƒ}t ||||t|ƒ¡}|dkrptƒ ‚|r€td| ƒ‚t|ƒS )Né   z&monty_multiply() failed with error: %d)	r   Úlenr   r   Zmonty_multiplyr   r	   Ú
ValueErrorr   )	Zterm1Zterm2ÚmodulusZ	modulus_bÚnumbers_lenZterm1_bZterm2_bÚoutÚerrorr   r   r   Ú
monty_mult5   s*    

ûr   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                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestModMultiplyc                 C   s   |   dtdddƒ¡ d S )Nó   é   é   é   )ÚassertEqualr   )Úselfr   r   r   Ú
test_smallW   s    zTestModMultiply.test_smallc                 C   sH   t  ¡ d d }t d }t d }d|d  d }|  |t||t ƒ¡ d S )Né   é   é   éZ   ó    é   ó   -©Úmodulus1Ú
bit_lengthr   r   )r   r   Út1Út2Úexpectr   r   r   Ú
test_largeZ   s
    zTestModMultiply.test_largec                 C   sD   t  ¡ d d }d| }|  |tddt ƒ¡ |  |tddt ƒ¡ d S )Nr   r    r#   é   r   r&   )r   r   r+   r   r   r   Útest_zero_termb   s    zTestModMultiply.test_zero_termc                 C   s,   dd }d}t t||tƒƒ}|  ||¡ d S )Nr!   iÿ  l‰   ]
ïu¼z!Ãf¹ï(Å4(8U`Ë&ú`äD6­""¸)ql©fP	±c›j‚@Np:+ -ßz=wÔwLÁùï,
G!é&L=}ÈCm;!O¶:/	} Ž}d	ªSJV˜QškùBswvY#(Ì™HÎe)Î{BH<sîU)Aù>eo¬O‰?am{�—EkG]&Ð\nr«‘Tð}îw/~	˜è6í(áo?%RNt8ÁM$o‘d“BÔô5`‹98/ÿ>A©]¤¤?¤'l±R™W9Iog/8’)]WÙ †qüü5®vÎ0¤u€qFî}î61ºWÇq} oŽ )r   r   r'   r   )r   r)   Z
expect_intÚresr   r   r   Útest_larger_termh   s    z TestModMultiply.test_larger_termN)r
   r   r   r   r,   r.   r0   r   r   r   r   r   U   s   r   c                 C   s   g }|t tƒ7 }|S ©N)r   r   )ÚconfigZtestsr   r   r   Ú	get_testso   s    r3   Ú__main__c                   C   s   t  tƒ ¡S r1   )ÚunittestZ	TestSuiter3   r   r   r   r   Úsuitev   s    r6   )ZdefaultTest)Ú__doc__r5   ZCrypto.SelfTest.st_commonr   ZCrypto.Util.numberr   r   ZCrypto.Util._raw_apir   r   r   ZCrypto.Math._IntegerCustomr   r   r	   r   r'   ZTestCaser   r3   r
   r6   Úmainr   r   r   r   Ú<module>"   s   