U
    Mf                     @   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rd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   I/tmp/pip-unpacked-wheel-l_0d1exj/Cryptodome/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 |rt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%=QU)5d_*iRy^in3&y_!oicpJFXQM0,J&[{"s}N,C20\'j7.8aMRMt
CIsD	koCvj']/S<iJvcTr.wFFuZeq9<*M["t,`@T:KZ
'SnkD5xl!Xyy99vM"*^ x+j~oB8s?vj	rK?/jfe@\6d7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"")qlfP	cj@Np:+ -z=wwL,
G!&L=}Cm;!O:/	} }d	SJVQkBswvY#(He){BH<sU)A>eoO?am{EkG]&\nrT}w/~	6(o?%RNt8M$odB5`98/>A]?'lRW9Iog/8)]W q5v0uqF}61Wq}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   )configtestsr   r   r   	get_testso   s    r4   __main__c                   C   s   t t S r1   )unittestZ	TestSuiter4   r   r   r   r   suitev   s    r7   )ZdefaultTest)__doc__r6   ZCryptodome.SelfTest.st_commonr   ZCryptodome.Util.numberr   r   ZCryptodome.Util._raw_apir   r   r   ZCryptodome.Math._IntegerCustomr   r   r	   r   r'   ZTestCaser   r4   r
   r7   mainr   r   r   r   <module>"   s   