U
    ÈZjc  ã                   @   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Crypto.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   ú]/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/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|ƒ¡}	|	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"   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Crypto.Util.numberr   r   ZCrypto.Util._raw_apir   r   r   r	   r
   r   ZCrypto.Random.randomr   Zc_defsr"   Úimplementationr   r   r   r   r   Ú<module>   s    

