U
    gs                     @   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._modexpZcustom)libraryapic                   @   s0   e Zd Zed	ddZd
ddZedd ZdS )IntegerCustombigc                 C   s8   |dkr
n"|dkr$t | } |   ntdtt| S )Nr   littlezIncorrect byteorder)	bytearrayreverse
ValueErrorr   r   )Zbyte_string	byteorder r   B/tmp/pip-unpacked-wheel-_q8s9isk/Cryptodome/Math/_IntegerCustom.py
from_bytesA   s    
zIntegerCustom.from_bytesNc              
   C   s  t |}|dk rtd|d kr2t| j|| _| S t |}|dk rJtd|dkrZtd|d@ dkrzt| j||| _| S | j|kr|  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)intr   pow_valueZeroDivisionErrorlenr   maxr   _raw_montgomeryZ	monty_powr
   r   r   r   r   )selfexponentmodulusZ	exp_value	mod_valuemax_lenZbase_bZexp_b	modulus_bouterrorresultr   r   r   inplace_powL   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sL| dk rT| |; } ||ksd|dk rl||; }t|}t|}t| |}t||}t|}t||||t|}	|	rt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"   Zmonty_multiplyr
   r   )
Zterm1Zterm2r%   r&   r(   Znumbers_lenZterm1_bZterm2_br)   r*   r   r   r   _mult_modulo_bytes~   s4    

z IntegerCustom._mult_modulo_bytes)r   )N)__name__
__module____qualname__staticmethodr   r,   r-   r   r   r   r   r   ?   s
   

2r   N)Z_IntegerNativer   ZCryptodome.Util.numberr   r   ZCryptodome.Util._raw_apir   r   r   r	   r
   r   ZCryptodome.Random.randomr   Zc_defsr"   implementationr   r   r   r   r   <module>   s    

