o
    ‰¡ey  ã                   @   st   d dl mZ ddlmZmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ dZedeƒZde	d	œZG d
d„ deƒZdS )é   )ÚIntegerNativeé    )Úlong_to_bytesÚbytes_to_long)Úload_pycryptodome_raw_libÚcreate_string_bufferÚget_raw_bufferÚbackendÚc_size_tÚc_ulonglong)Úgetrandbitsaž  
int monty_pow(uint8_t       *out,
              const uint8_t *base,
              const uint8_t *exp,
              const uint8_t *modulus,
              size_t        len,
              uint64_t      seed);

int monty_multiply(uint8_t       *out,
                   const uint8_t *term1,
                   const uint8_t *term2,
                   const uint8_t *modulus,
                   size_t        len);
zCryptodome.Math._modexpÚcustom)ÚlibraryÚapic                   @   s.   e Zd Zedd„ ƒZddd„Zedd„ ƒZdS )	ÚIntegerCustomc                 C   s   t t| ƒƒS ©N)r   r   )Úbyte_string© r   ú@/usr/lib/python3/dist-packages/Cryptodome/Math/_IntegerCustom.pyÚ
from_bytesA   s   zIntegerCustom.from_bytesNc              
   C   s  t |ƒ}|dk rtdƒ‚|d u rt| j|ƒ| _| S t |ƒ}|dk r%tdƒ‚|dkr-tdƒ‚|d@ dkr=t| j||ƒ| _| S | j|krI|  j|;  _ttt| j||ƒƒƒ}t| j|ƒ}t||ƒ}t||ƒ}t|ƒ}	t	 
|	|||t|ƒttdƒƒ¡}
|
r€td|
 ƒ‚tt|	ƒƒ}|| _| S )Nr   zExponent must not be negativeúModulus must be positiveúModulus cannot be zeror   é@   zmonty_pow failed with error: %d)ÚintÚ
ValueErrorÚpowÚ_valueÚZeroDivisionErrorÚlenr   Úmaxr   Ú_raw_montgomeryÚ	monty_powr
   r   r   r   r   )ÚselfÚexponentÚmodulusÚ	exp_valueÚ	mod_valueÚmax_lenÚbase_bÚexp_bÚ	modulus_bÚoutÚerrorÚresultr   r   r   Úinplace_powE   sD   



ú	zIntegerCustom.inplace_powc           
      C   sÆ   t |ƒ}|dk rtdƒ‚|dkrtdƒ‚|d@ dkrtdƒ‚| |ks&| dk r*| |; } ||ks2|dk r6||; }t|ƒ}t|ƒ}t| |ƒ}t||ƒ}t|ƒ}t ||||t|ƒ¡}	|	r_td|	 ƒ‚t	|ƒS )Nr   r   r   r   zOdd modulus is requiredz$monty_multiply failed with error: %d)
r   r   r   r   r   r   r    Úmonty_multiplyr
   r   )
Úterm1Úterm2r$   r&   r*   Únumbers_lenÚterm1_bÚterm2_br+   r,   r   r   r   Ú_mult_modulo_bytesw   s4   

ûz IntegerCustom._mult_modulo_bytesr   )Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r.   r5   r   r   r   r   r   ?   s    

2r   N)Ú_IntegerNativer   ÚCryptodome.Util.numberr   r   ÚCryptodome.Util._raw_apir   r   r   r	   r
   r   ÚCryptodome.Random.randomr   Úc_defsr    Úimplementationr   r   r   r   r   Ú<module>   s    

