o
    _¨Êh	  ã                   @   s–   d Z dZdgZddlZejd dkrejd dkrddlT ddlmZmZm	Z	 G d	d
„ d
e
ƒZG dd„ deƒZddd„ZG dd„ deƒZddd„ZdS )zUPure Python implementation of the RSA-related portions of Crypto.PublicKey._fastmath.z$Id$Úrsa_constructé    Né   é   )Ú*)ÚsizeÚinverseÚGCDc                   @   s   e Zd ZdS )ÚerrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úL/var/www/html/env/lib/python3.10/site-packages/Crypto/PublicKey/_slowmath.pyr	   %   s    r	   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )Ú_RSAKeyc                 C   s   |t || j| jƒ S ©N©ÚpowÚeÚn©ÚselfÚmÚrr   r   r   Ú_blind)   s   z_RSAKey._blindc                 C   s   t || jƒ| | j S r   )r   r   r   r   r   r   Ú_unblind-   s   z_RSAKey._unblindc                 C   sª   |   ¡ stdƒ‚t| dƒrMt| dƒrMt| dƒrMt|| j| jd  | jƒ}t|| j| jd  | jƒ}|| }|dk r>|| j }|| j | j }|| j | S t|| j| jƒS )NúNo private keyÚpÚqÚur   r   )	Úhas_privateÚ	TypeErrorÚhasattrr   Údr   r   r   r   )r   ÚcÚm1Úm2Úhr   r   r   Ú_decrypt1   s   
z_RSAKey._decryptc                 C   s   t || j| jƒS r   r   ©r   r   r   r   r   Ú_encrypt?   s   z_RSAKey._encryptc                 C   s   |   ¡ stdƒ‚|  |¡S )Nr   )r   r    r'   r(   r   r   r   Ú_signC   s   
z_RSAKey._signc                 C   s   |   |¡|kS r   )r)   )r   r   Úsigr   r   r   Ú_verifyH   s   z_RSAKey._verifyc                 C   ó
   t | dƒS )Nr"   ©r!   ©r   r   r   r   r   K   ó   
z_RSAKey.has_privatec                 C   ó   t | jƒd S ©z7Return the maximum number of bits that can be encryptedr   )r   r   r/   r   r   r   r   N   ó   z_RSAKey.sizeN)r
   r   r   r   r   r'   r)   r*   r,   r   r   r   r   r   r   r   (   s    r   c                 C   sÌ  t | tƒsJ ‚t |tƒsJ ‚t |ttdƒfƒsJ ‚t |ttdƒfƒs$J ‚t |ttdƒfƒs/J ‚t |ttdƒfƒs:J ‚tƒ }| |_||_|du rI|S ||_|dur[|dur[||_||_nx|| d }|}|d dkrvt	|dƒd }|d dksid}	d}
|	s»|
dk r»|}||k r±t
|
|| ƒ}|dkr©|| d kr©t
|d| ƒdkr©t|d | ƒ|_d}	n|d }||k s†|
d }
|	s»|
dk s€|	sÁtdƒ‚| |j dksÊJ ‚t	| |jƒd |_|durÜ||_|S t|j|jƒ|_|S )zConstruct an RSAKey objectNr   r   r   éd   z2Unable to compute factors p and q from exponent d.)Ú
isinstanceÚintÚtyper   r   r   r"   r   r   Údivmodr   r   Ú
ValueErrorr   r   )r   r   r"   r   r   r   ÚobjÚktotÚtÚspottedÚaÚkÚcandr   r   r   r   R   sV   ÿ$÷òÿc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_DSAKeyc                 C   r1   r2   )r   r   r/   r   r   r   r   �   r3   z_DSAKey.sizec                 C   r-   )NÚxr.   r/   r   r   r   r   “   r0   z_DSAKey.has_privatec                 C   sx   |   ¡ stdƒ‚d|  k r| jk stdƒ‚ tdƒ‚t|| jƒ}t| j|| jƒ| j }||| j|   | j }||fS )Nr   r   zk is not between 2 and q-1)	r   r    r   r9   r   r   Úgr   rB   )r   r   r?   Úinv_kr   Úsr   r   r   r*   –   s   ÿz_DSAKey._signc                 C   s–   d|  k r| j k rn dS d|  k r| j k sdS  dS t|| j ƒ}|| | j  }|| | j  }t| j|| jƒt| j|| jƒ | j | j  }||kS )Nr   F)r   r   r   rC   r   Úy)r   r   r   rE   ÚwÚu1Úu2Úvr   r   r   r,   ¡   s   ÿÿ,z_DSAKey._verifyN)r
   r   r   r   r   r*   r,   r   r   r   r   rA   Ž   s
    rA   c                 C   s~   t | tƒsJ ‚t |tƒsJ ‚t |tƒsJ ‚t |tƒsJ ‚t |ttd ƒfƒs'J ‚tƒ }| |_||_||_||_|d ur=||_|S r   )	r5   r6   r7   rA   rF   rC   r   r   rB   )rF   rC   r   r   rB   r:   r   r   r   Údsa_construct«   s   rK   )NNNNr   )Ú__doc__Ú__revision__Ú__all__ÚsysÚversion_infoÚCrypto.Util.py21compatÚCrypto.Util.numberr   r   r   Ú	Exceptionr	   Úobjectr   r   rA   rK   r   r   r   r   Ú<module>   s   
*<