o
    Ìn~b°  ã                   @   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)ÚgetrandbitszË
int monty_pow(const uint8_t *base,
               const uint8_t *exp,
               const uint8_t *modulus,
               uint8_t       *out,
               size_t len,
               uint64_t seed);
zCryptodome.Math._modexpZcustom)ZlibraryÚapic                   @   s"   e Zd Zedd„ ƒZddd„ZdS )ÚIntegerCustomc                 C   s   t t| ƒƒS ©N)r   r   )Zbyte_string© r   úI/usr/local/lib/python3.10/dist-packages/Cryptodome/Math/_IntegerCustom.pyÚ
from_bytes;   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 negativezModulus must be positivezModulus cannot be zeror   é@   zmonty_pow failed with error: %d)ÚintÚ
ValueErrorÚpowÚ_valueÚZeroDivisionErrorÚlenr   Úmaxr   Ú_raw_montgomeryZ	monty_powr
   r   r   r   r   )ÚselfÚexponentÚmodulusZ	exp_valueZ	mod_valueÚmax_lenZbase_bZexp_bZ	modulus_bÚoutÚerrorÚresultr   r   r   Úinplace_pow?   sD   



ú	zIntegerCustom.inplace_powr   )Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r#   r   r   r   r   r   9   s    
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    


