o
    5Îhc  ã                   @   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._modexpÚ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   )Úbyte_stringÚ	byteorder© r   ún/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/Crypto/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)Úintr   Ú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_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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/   r0   r   r   r   Ú_mult_modulo_bytes~   s4   

ûz IntegerCustom._mult_modulo_bytes)r   )N)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r2   r9   r   r   r   r   r   ?   s    

2r   N)Ú_IntegerNativer   ÚCrypto.Util.numberr   r   ÚCrypto.Util._raw_apir   r   r   r	   r
   r   ÚCrypto.Random.randomr   Úc_defsr$   Úimplementationr   r   r   r   r   Ú<module>   s    

