B
    ?[	                 @   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   9lib/python3.7/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 )N)r   r   )r   r   r   r   r   r   _unblind-   s    z_RSAKey._unblindc             C   s   |   stdt| drt| drt| drt|| j| jd  | j}t|| j| jd  | j}|| }|dk r||| j }|| j | j }|| j | S t|| j| jS )NzNo private keypqur   r   )	has_private	TypeErrorhasattrr   dr   r   r   r   )r   cZm1Zm2hr   r   r   _decrypt1   s    
z_RSAKey._decryptc             C   s   t || j| jS )N)r   r   r   )r   r   r   r   r   _encrypt?   s    z_RSAKey._encryptc             C   s   |   std| |S )NzNo private key)r   r   r!   )r   r   r   r   r   _signC   s    z_RSAKey._signc             C   s   |  ||kS )N)r"   )r   r   Zsigr   r   r   _verifyH   s    z_RSAKey._verifyc             C   s
   t | dS )Nr   )r   )r   r   r   r   r   K   s    z_RSAKey.has_privatec             C   s   t | jd S )z7Return the maximum number of bits that can be encryptedr   )r   r   )r   r   r   r   r   N   s    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tt |tstt |ttdfs2tt |ttdfsHtt |ttdfs^tt |ttdfsttt }| |_||_|dkr|S ||_|dk	r|dk	r||_||_	n|| d }|}x|d dkrt
|dd }qW d}	d}
x|	st|
dk rt|}xd||k rht|
|| }|dkr\|| d kr\t|d| dkr\t|d | |_d}	P |d }qW |
d }
qW |	std| |j dkstt
| |jd |_	|dk	r||_nt|j|j	|_|S )zConstruct an RSAKey objectNr   r   r   d   z2Unable to compute factors p and q from exponent d.)
isinstanceintAssertionErrortyper   r   r   r   r   r   divmodr   r   
ValueErrorr   r   )r   r   r   r   r   r   objZktottZspottedakZcandr   r   r   r   R   sN    *
c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_DSAKeyc             C   s   t | jd S )z7Return the maximum number of bits that can be encryptedr   )r   r   )r   r   r   r   r      s    z_DSAKey.sizec             C   s
   t | dS )Nx)r   )r   r   r   r   r      s    z_DSAKey.has_privatec             C   sr   |   stdd|  k r&| jk s0n tdt|| j}t| j|| j| j }||| j|   | j }||fS )NzNo private keyr   zk is not between 2 and q-1)	r   r   r   r+   r   r   gr   r1   )r   r   r/   Zinv_kr   sr   r   r   r#      s    z_DSAKey._signc             C   s   d|  k r| j k r2n nd|  k r0| j k s6n dS t|| j }|| | j  }|| | j  }t| j|| jt| j|| j | j | j  }||kS )Nr   F)r   r   r   r2   r   y)r   r   r   r3   wZu1Zu2vr   r   r   r$      s    2,z_DSAKey._verifyN)r
   r   r   r   r   r#   r$   r   r   r   r   r0      s   r0   c             C   s~   t | tstt |tstt |ts*tt |ts8tt |ttd fsNtt }| |_||_||_||_|d k	rz||_	|S )N)
r&   r'   r(   r)   r0   r4   r2   r   r   r1   )r4   r2   r   r   r1   r,   r   r   r   dsa_construct   s     r7   )NNNN)N)__doc__Z__revision____all__sysversion_infoZCrypto.Util.py21compatZCrypto.Util.numberr   r   r   	Exceptionr	   objectr   r   r0   r7   r   r   r   r   <module>   s   *
<